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. Android Permission 访问权限大全(转)

    程序执行需要读取到安全敏感项必需在androidmanifest.xml中声明相关权限请求, 完整列表如下: android.permission.ACCESS_CHECKIN_PROPERTIES允 ...

  2. thinkphp怎么设置输入网址直接进入首页

    1.设置apache服务器的时候,文件的位置要写包含index.php的那个主文件夹. 2.apache和thinkphp默认index.html是作为网站的默认首页,所以在浏览器端可以直接输入网址进 ...

  3. Oracle 编程

    编程:储存过程,自定义函数,触发器,包. 储存过程 在命令窗口用exec调 作用:存储在数据库中用于完成某个功能的程序 创建在 procedure里 create or replace procedu ...

  4. windows 下使用Nginx替代apache作为服务器

    说实话, 在windows下使用Nginx 着实有点不太方便, 但因项目需求, 又不想换系统(虽然可以搞个虚拟机玩), 只能用Nginx了 好了, 不多说了. 开始... 首先我用的是xampp包(A ...

  5. Mac入门(一)基本用法

    我前五年一直外包到微软,每天使用的都是Windows系统和.NET. 2012年加入VMware,  公司的工作机是台Mac 笔记本(MacBook Pro), 所以有机会接触Mac系统 Mac和Wi ...

  6. Apache的初中级面试题

    --- 原文:[关于Apache的25个初中级面试题](http://www.oschina.net/translate/apache-interview-questions) Apache 求职面试 ...

  7. 打印发现function toUpperCase() { [native code] }

    var s='hello' undefined s.toUpperCase function toUpperCase() { [native code] } s.toUpperCase() " ...

  8. jQuery用户数字评分效果

    效果预览:http://hovertree.com/texiao/jquery/5.htm HTML文件代码: <!DOCTYPE html> <html xmlns="h ...

  9. 火狐下多个span连在一起和换行写存在差异

    当父元素的宽度确定,多个span换行写,span加起来占的宽度比预设的大

  10. Attempt to insert non-property list object 报错原因

    NSUserDefault 支持的存储类型有:NSString. NSNumber.NSDate. NSArray.NSDictionary.BOOL.NSInteger.NSFloat等系统定义的数 ...