tomcat和HTTP

1.tomcat的关闭和启动

启动:sudo /opt/tomcat/bin/startup.sh

关闭:sudo /opt/tomcat/bin/shutdown.sh

2.tomcat的文档目录结构

2.1.tomcat的文档结构

tomcat根目录下:

|-bin:存放tomcat的命令,例如启动和关闭命令

|-conf:存放tomcat的配置信息,其中server.xml文件是核心的配置文件。

|-lib:支持tomcat运行的jar包,其中还有技术支持包,如servlet,jsp等

|-logs:运行过程的日志信息

|-temp:临时目录

|-work:tomcat的运行目录。jsp运行时产生的临时文件就存放在这里

|-webapps“共享资源目录,web应用目录(注意不能以单独的文件进行共享,要以这个项目为一个整体来共享)

2.2.webapps的文档目录结构

WebRoot根目录下:

静态资源(html+css+js+image+vedio)

|-WEB-INF:固定写法

|-WEB-INF/classes:(可选)固定写法,存放class字节码文件

|-WEB-INF/lib:(可选)固定写法,存放jar包文件

|-WEB-INF/web.xml:配置文件

注意:

1.WEB-INF目录里面的资源不能通过浏览器直接访问

2.如果希望访问到WEB-INF里面的资源,就必须把资源配置到一个叫web.xml的文件中

3.HTTP协议

3.1.GET和POST的区别

GET方式提交:

1.地址栏(URI)会跟上参数数据。以?开头,多个参数之间用&分割

2.GET提交参数数据有限制,不超过1kb

3.GET方式不适合提交敏感信息,如密码

4.注意:浏览器直接访问的请求,默认提交方式是GET

POST方式提交:

1.参数不会跟着URI后面,而是跟在请求的实体内容中,没有?开头,多个参数之间使用&分割

2.POST提交的参数数据没有限制

3.POST方式提交敏感数据

3.2.HttpServletRequest获取请求数据

浏览器通过Http请求获取数据信息,可是如果我们想获取这个Http请求内的信息时用什么方法呢?

可以使用HttpServletRequest这里类,这个类是用在服务器端的。主要包含一下一个API

请求行:

request.getMethod(); 请求方式

request.getRequetURI()/request.getRequetURL() 请求资源

request.getProtocol() 请求http协议版本

请求头:

request.getHeader("名称") 根据请求头获取请求值

request.getHeaderNames() 获取所有的请求头名称

实体内容:

request.getInputStream() 获取实体内容数据

代码示例:

/**
* HttpServletRequest类方法的测试
*/
@WebServlet(name = "RequestServer")
public class RequestServer extends HttpServlet { /**
* 这个类在创建的时候,服务器就已经帮我们做了下面两件事情,所以我们只需要获取就可以了
* 1.tomcat服务器接收到浏览器发送的请求数据,然后封装到HttpServetRequest对象
* 2.tomcat服务器调用doGet方法,然后把request对象传入到servlet中。
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* 3.从reques对象取出请求数据
*/ //3.1请求行(GET /index HTTP/1.1)
RequestLine(request);
//3.2请求头
RequestHeader(request);
//3.3请求的实体内容
RequestContent(request);
} //3.1请求行
private void RequestLine(HttpServletRequest request) {
//请求的http协议
System.out.println("请求的http协议:"+request.getProtocol());
//请求的资源
System.out.println("请求的资源URI:"+request.getRequestURI());
System.out.println("请求的资源URL:"+request.getRequestURL());
//请求的方式
System.out.println("请求的方式:"+request.getMethod());
} //3.2请求头
private void RequestHeader(HttpServletRequest request) {
//根据头名称得到头内容
System.out.println(request.getHeader("请求头:"+"Host"));
//得到所有的请求头名称列表
Enumeration<String> enums = request.getHeaderNames();
while (enums.hasMoreElements()){
String headerName = enums.nextElement();
System.out.println("所有请求头分别是:"+enums);
} } //3.3请求的实体内容
private void RequestContent(HttpServletRequest request) throws IOException {
InputStream in = request.getInputStream();
byte[] buf = new byte[1024];
int len = 0;
while ((len=in.read())!=-1){
String str = new String(buf,0,len);
System.out.println(str);
}
}
}

3.3.如何获取GET和POST的请求参数

GET方式:参数放在URI后面

POST方式:参数放在实体内容中

虽然位置不一样,但是都是适用于同一个api方法。

request.getParameter("参数名"); 根据参数名获取参数值(注意,只能获取一个值的参数)

request.getParameterValue("参数名“);根据参数名获取参数值(可以获取多个值的参数)

request.getParameterNames(); 获取所有参数名称列表

3.4.请求参数的编码问题

由于请求参数的时候,方法会把编码解码,然后再编码,这个过程会造成乱码的现象。

为了解决这个问题,需要在doPost和doGet方法下先重新设置编码格式,然后再读取参数。

注意,重新设置编码格式必须放在请求参数之前

修改POST方式参数编码:

POST方式可以一键解码

request.setCharacterEncoding("utf-8");

修改GET方式参数编码:

GET解码需要对每个请求重新编码

手动解码:String name = new String(name.getBytes("iso-8859-1"),"utf-8");

示例代码:

/**
* 测试如何获取GET和POST的请求参数
*/
@WebServlet(name = "RequestArgs")
public class RequestArgs extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//接收POST方式接收的参数
/*
System.out.println("POS提交的参数");
InputStream in = request.getInputStream();
byte[] buf = new byte[1024];
int len = 0;
while ((len=in.read())!=-1){
System.out.println(new String(buf,0,len));
}
*/
//正确做法:统一方便的索取请求参数的方法
request.setCharacterEncoding("utf-8");
this.doGet(request,response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//接收GET方式提交的参数
/*
//笨方法
String value = request.getQueryString();
System.out.println(value);
*/
//正确做法:统一方便的索取请求参数的方法
//根据参数名得到参数值,只能获取一个值的参数
String name = request.getParameter("name");//返回name参数值
//编码
if ("GET".equals(request.getMethod())){
name = new String(name.getBytes("iso-8859-1"),"utf-8");
} String passw = request.getParameter("passwd");//返回passwd参数值
if ("GET".equals(request.getMethod())){
passw = new String(passw.getBytes("iso-8859-1"),"utf-8");
}
System.out.println(name+"="+passw);
//根据参数名获取多个同名参数
request.getParameterValues("hobit"); //得到所有的参数
Enumeration<String> enums = request.getParameterNames();
while (enums.hasMoreElements()){
String paramName = enums.nextElement();
String paramValue = request.getParameter(paramName);
if ("GET".equals(request.getMethod())){
paramValue = new String(paramValue.getBytes("iso-8859-1"),"utf-8");
}
System.out.println(paramName+"="+paramValue);
} }
}

4.HTTP响应

4.1.状态码

每一个HTTP响应都有一个状态码来标识服务器处理这个请求的结果是什么样的

常见的状态码有:

100~199:表示成功接收请求,要去客户端继续提交下一次请求才能完成整个处理过程

200~299:表示成功接收请求并完成整个处理过程,常用200表示请求完美处理,并返回

300~399:为完成请求,需进一步细化请求,例如请求的资源已经移动一个新的地址。常用302

400~499:客户端的请求有错误,常用404表示请求的资源找不到

500~599:服务器出现错误

4.2.HttpServletResponse修改HTTP响应信息

HttpServletResponse对象修改响应信息:

响应行

response.setStatus() 设置状态码

响应头

response.setHeader("name","value") 设置响应头

实体内容

response.getWriter().writer(); 发送字符实体内容

response.getOutputStream().writer() 发送字节实体内容

代码示例:

/**
*测试 HttpServletResponse对象修改响应信息
*/
@WebServlet(name = "ResponseDemo")
public class ResponseDemo extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } /**
* 在调用doGet方法之前,服务器已经做了一下操作
* 1.tomcat服务器把请求信息封装到HttpServervletRequest对象,且把响应信息封装到HttpServletResponse
* 2.tomcat服务器调用doGet方法,传入request,response
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /**
* 3.通过response对象改变响应信息
*/
//3.1.响应行
// response.setStatus(404);//只修改状态码,不改变页面
// response.sendError(404);//发送404状态码+404错误页面 //3.2.响应头
response.setHeader("server","JBos");//改变服务器类型 //3.3.实体内容(浏览器直接能够看到的内容就是实体内容)
//方法1:
response.getWriter().write("hello World");//字符内容
//方法2:
response.getOutputStream().write("hello World".getBytes());//字节内容
}
/**
* 4.tomcat服务器把response对象内容自动转换成响应格式内容,再发送给浏览器解析
*/
}

4.3.案例分析

请求重定向

/**
* 请求重定向
*/
@WebServlet(name = "RodirectDemo")
public class RodirectDemo extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* 需求:跳转到adv.html
* 使用请求重定向:发送一个302状态码+localtion的响应头
*/
//方法1:
response.setStatus(302);
response.setHeader("location","/adv.html");
//方法2:
response.sendRedirect("/adv.html"); }
}

定时刷新

/**
* 定时刷新
*/
@WebServlet(name = "RefreshDemo")
public class RefreshDemo extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* 定时刷新
* 原理:浏览器认识refresh头,得到refresh头之后重新请求当前资源
*/
//每隔1秒刷新一次
response.setHeader("refresh","1");
//每隔3秒跳转到另外的资源
response.setHeader("refresh", "3;url=/adv.html");
}
}

content-Type作用

Content-Type: text/html; charset=GB2312 --表示服务器发送给浏览器的数据类型及内容编码

/**
* content-Type作用
*/
@WebServlet(name = "ContentTypeDemo")
public class ContentTypeDemo extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* 1.服务器发送给浏览器的数据类型
*/
response.setContentType("text/html");
//等价于上面,推荐使用上面的
response.setHeader("content-type","text/html"); response.setContentType("image/jpg");
}
}

tomcat和HTTP的更多相关文章

  1. Tomcat一个BUG造成CLOSE_WAIT

    之前应该提过,我们线上架构整体重新架设了,应用层面使用的是Spring Boot,前段日子因为一些第三方的原因,略有些匆忙的提前开始线上的内测了.然后运维发现了个问题,服务器的HTTPS端口有大量的C ...

  2. docker——容器安装tomcat

    写在前面: 继续docker的学习,学习了docker的基本常用命令之后,我在docker上安装jdk,tomcat两个基本的java web工具,这里对操作流程记录一下. 软件准备: 1.jdk-7 ...

  3. Tomcat shutdown执行后无法退出进程问题排查及解决

    问题定位及排查 上周无意中调试程序在Linux上ps -ef|grep tomcat发现有许多tomcat的进程,当时因为没有影响系统运行就没当回事.而且我内心总觉得这可能是tomcat像nginx一 ...

  4. 记一次tomcat线程创建异常调优:unable to create new native thread

    测试在进行一次性能测试的时候发现并发300个请求时出现了下面的异常: HTTP Status 500 - Handler processing failed; nested exception is ...

  5. Linux CentOS 配置Tomcat环境

    一.下载Tomcat 下载Tomcat方式也有两种,可以参考我的前一篇博文Linux CentOS配置JDK环境,这边就不再赘述. 二.在Linux处理Tomcat包 1.创建tomcat文件夹 mk ...

  6. 在Linux虚拟机下配置tomcat

    1.到Apache官网下载tomcat http://tomcat.apache.org/download-80.cgi 博主我下载的是tomcat8 博主的jdk是1.8 如果你们的jdk是1.7或 ...

  7. tomcat开发远程调试端口以及利用eclipse进行远程调试

    一.tomcat开发远程调试端口 方法1 WIN系统 在catalina.bat里:  SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compi ...

  8. Eclipse中启动tomcat报错java.lang.OutOfMemoryError: PermGen space的解决方法

    有的项目引用了太多的jar包,或者反射生成了太多的类,异或有太多的常量池,就有可能会报java.lang.OutOfMemoryError: PermGen space的错误, 我们知道可以通过jvm ...

  9. mac下安装及配置tomcat

    mac下的软件不像windows下的程序那样写注册表,对于tomcat的安装来说,在mac下是名符其实的绿色软件,具体操作如下: 1.到 apache官方主页 下载完整 tar.gz文件包.(没有专门 ...

  10. 设置tomcat远程debug

    查看端口占用情况命令: netstat -tunlp |grep 8000 tomcat 启动远程debug: startup.sh 中的最后一行 exec "$PRGDIR"/& ...

随机推荐

  1. button 按钮,结合onclick事件,验证和提交表单

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. EC笔记:第二部分:12、复制对象时勿忘其每一个成分

    EC笔记:第二部分:12.复制对象时勿忘其每一个成分 1.场景 某些时候,我们不想使用编译器提供的默认拷贝函数(包括拷贝构造函数和赋值运算符),考虑以下类定义: 代码1: class Point{ p ...

  3. FASTSOCKET

    FASTSOCKET It looks like there are like 3 separate optimizations, but I think the most important one ...

  4. Thinking in Java——笔记(19)

    Enumerated Types Basic enum features When you create an enum, an associated class is produced for yo ...

  5. 让网站动起来!12款优秀的 jQuery 动画插件推荐

    如今,大多数设计师和开发人员被要客户要求开发动态的网站.创造视觉震撼和醒目的动态网站是艰巨的任务,因为它需要大量的努力和创造力.在网络上有大量的工具和插件可用于创建网站动画.许多开发人员正在使用 HT ...

  6. CSS3——3D旋转图(跑马灯效果图)

    CSS3新增了很多新的属性,可以用很少的代码实现炫酷的动画效果,但由于兼容性各浏览器的能力存在不足,有特别需求的网站就呵呵啦.H5C3已是大势所趋了,之前看过一个新闻,Chrome将在年底全面转向H5 ...

  7. 【requireJS源码学习03】细究requireJS的加载流程

    前言 这个星期折腾了一周,中间没有什么时间学习,周末又干了些其它事情,这个时候正好有时间,我们一起来继续学习requireJS吧 还是那句话,小钗觉得requireJS本身还是有点难度的,估计完全吸收 ...

  8. 向ES6靠齐的Class.js

    写在前面 在2008年的时候,John Resig写了一 Class.js,使用的方式如下: var Person = Class.extend({ init: function(isDancing) ...

  9. Json to JObject转换的使用方法

    Linq to JSON是用来操作JSON对象的.可以用于快速查询,修改和创建JSON对象.当JSON对象内容比较复杂,而我们仅仅需要其中的一小部分数据时,可以考虑使用Linq to JSON来读取和 ...

  10. 基本排序算法——shell排序java实现

    shell排序是对插入排序的一种改进. package basic.sort; import java.util.Arrays; import java.util.Random; public cla ...