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. linux下tomcat安全配置

    转:http://www.tuicool.com/articles/R7fQNfQ 0x00 删除默认目录 安装完tomcat后,删除 $CATALINA_HOME/webapps 下默认的所有目录文 ...

  2. Xdebug文档(四)函数跟踪

    Xdebug能让你把所有函数调用,包括参数和返回值以不同的格式记录到文件中. 这些号称“函数跟踪”功能能帮助你面对一个新应用程序,亦或者在程序运行时你想弄清楚它在做什么.函数跟踪功能可以选择性地显示函 ...

  3. JS高程3.基本概念(4)操作符

    ECMA-262用于操作数据值的操作符包括: 算术操作符 位操作符 关系操作符 相等操作符 ECMAScript操作符的不同之处在于:它能够适用于很多值,包括字符串,数字值,布尔值,甚至是对象.(在应 ...

  4. vue+ vue-router + webpack 踩坑之旅

    说是踩坑之旅 其实是最近在思考一些问题 然后想实现方案的时候,就慢慢的查到这些方案   老司机可以忽略下面的内容了 1)起因  考虑到数据分离的问题  因为server是express搭的   自然少 ...

  5. 如何在mac上安装docker[记录自己在mac上安装docker的经历]

    0.引子 最近入手了一台mac笔记本,想在本地安装docker. 1.找安装文档. 文档地址:http://www.widuu.com/chinese_docker/installation/mac. ...

  6. PowerDesigner 逆向工程 Mariadb 失败

    作者环境是win8.1 64位置 PowerDesigner 15, Mariadb 10+,在逆向的过程中发生错误,导致只能逆向出表对象,但是表对象中的字段信息确实没有的. 错误信息中的一部分是:  ...

  7. JS特效之Tab标签切换

    在我们平时浏览网站的时候,经常看到的特效有图片轮播.导航子菜单的隐藏.tab标签的切换等等.这段时间学习了JS后,开始要写出一些简单的特效.今天我也分享一个简单tab标签切换的例子.先附上代码: HT ...

  8. Atitit.去除水印的方案

    Atitit.去除水印的方案 1.1. 查找水印的位置 Kegwa imgd posit zo ok le .. Auto find d zo troub ...manu easy 1.2. 还原去除 ...

  9. 优质Android小部件:索尼滚动相册

    虽然骚尼手机卖的不怎么样,但是有些东西还是做的挺好的,工业设计就不用说了,索尼的相册的双指任意缩放功能也是尤其炫酷.其桌面小部件滚动相册我觉得也挺好的,比谷歌原生的相册墙功能好多了,网上搜了一下也没发 ...

  10. ObjectAnimator属性动画应用demo

    感谢慕课网--eclipse_xu 布局文件:activity_main.xml <FrameLayout xmlns:android="http://schemas.android. ...