Http协议、Tomcat、servlet

Stella981
• 阅读 799

HTTP协议

Http,超文本传输协议是互联网上最广泛的一种网络协议,所有的www文件都必须遵守这个标准。

Http协议由http请求和http响应组成

http请求:

1.请求行

请求方式 POST、GET、PUT、DELETE等

请求的资源 /DemoEE/form.html

协议版本 http/1.1

2.请求头

cookie 浏览器缓存的cookie信息

User-Agent 客户端浏览器与操作系统相关信息

Connection 保持连接状态Keep-Alive 连接中,close 已关闭。

Host 请求的服务器主机名

Content-Length 请求的长度

Content-Type 如果是Post请求会由这个表头,默认值为 application/x-www-form-urlencodeed 表示请求提内容使用url编码

Accept 浏览器可MIME类型,文件类型的一种描述方式。如:text/html,text/css,text/javascript,iamge/*

Accept-Encoding 浏览器支持的数据压缩格式如GZIP压缩

Accept-Language 浏览器支持的语言

3.请求体

Post请求方式: 请求体会由请求的参数 如 username=1&password=2

Get请求方式:请求参数不会出现在请求体重,会拼接在url后面 xxx.jsp?username=1&password=2

Http响应:

1.响应行

Http 状态码 200(请求成功),302(请求重定向),304(请求资源没有改变,访问本地缓存),404(请求资源不存在),500(服务器内部错误)

2.响应头

Location 302时,指定响应的路径。

Content-Type 响应正文的类型MiMe类型

Set-Cookie 服务器向浏览器写入cookie

Content-Encoding 服务器使用的压缩格式

Content-length 响应正文长度

Refresh 定时刷新。 几秒后调到哪个url

Server 服务器名称

Last-Modified 文件最后修改时间

3.响应体

服务器返回给浏览器的页面正文,浏览器将正文加载到内存,然后渲染解析显示出来。

B/S Browser/Server 浏览器端

C/S Client/Server 客户端

静态资源:html页面,数据不会改变。

动态资源:写程序的页面,如asp、php。

Tomcat

Tomcat Apache 开源免费的中小型web应用服务器

https://tomcat.apache.org/

点击tar.gz下载 windows下载 64-bit windows zip

Tomcat的目录结构

bin 脚本目录

conf 配置目录

lib 依赖jar库目录

logs 日志目录

temp 临时文件目录

webapps web应用发布目录

work tomcat处理jsp的工作目录

bin脚本目录

windows执行 .bat版本 mac执行.sh版本

启动脚本:startup.sh

停止脚本:shuntdown.sh

conf配置文件目录

核心配置文件:server.xml

用户权限配置文件:tomcat-users.xml

所有web项目默认配置文件:web.xml

打开终端

1.cd 进入根目录

2.执行 sh bin/startup.sh 启动服务器

3.浏览器输入localhost:8080

在webapps中放入网站 输入网址/文件夹名 即可访问

localhost:8080/myProject

如果启动失败常见原因:

1.端口冲突

server.xml

找到Connector元素 修改port属性可以更改端口号

<Connector port="8080" protocol="HTTP/1.1"

connectionTimeout="20000"

redirectPort="8443" />

2.没有配置java_home环境变量

servlet

Servlet是运行在服务器端的java小程序,是sun公司提供一套规范(接口),用来处理客户端请求、响应操作。

Servlet的生命周期

1. init(ServletCOnfig config) 初始化 创建servlet的时候执行

2.service(ServletRequest request,ServletResponse response) 每次请求都会执行

3.destroy() 销毁 servlet销毁时执行

一、Idea 配置

1.新建web application项目 Idea 选择 Java Enterprise -> web application

2.新版本没有web-inf文件夹 解决方法 进入project structure ->facets->点击小加号,添加web.xml

3.在web/WEB-INF目录下新建两个文件夹,classes用于存放servlet的字节码文件(.class),lib用于存放项目引用的包。

4.进入Project Structure,进入Modules(IDEA的工程)选项卡,将Paths的两个输出路径均改成第2步新建的classes。

5.然后点击Dependencies,选择右边+号,新建JARS路径,选择第2步创建的lib文件夹 - >Jar Directory

6.进入Artifacts选项卡,将输出目录定为Tomcat安装位置的webapps下新建的该工程文件夹

7.Run->Edit Configurations配置Tomcat,设置tomcat端口等信息。

8.设置默认启动路径 http://localhost:9999/servlet/ 或手动输入

二、创建类并实现 Servlet接口 重写方法

public class QuickStartServlet implements Servlet {

@Override

public void init(ServletConfig servletConfig) throws ServletException {

System.out.print("init running..");

}

@Override

public ServletConfig getServletConfig() {

System.out.print("getServletConfig running..");

return null;

}

@Override

public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

System.out.print("service running..");

}

@Override

public String getServletInfo() {

System.out.print("getServletInfo running..");

return null;

}

@Override

public void destroy() {

System.out.print("destroy running..");

}

}

3.配置web.xml文件

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app\_3\_1.xsd"

version="3.1">

QuickStartServlet

com.david.servlet.QuickStartServlet

QuickStartServlet

/QuickStartServlet

浏览器输入 http://localhost:9999/servlet/QuickStartServlet 访问

ServletContext 上下文对象

QuickStartServlet

com.david.servlet.QuickStartServlet

name

david

新增init-param节点 使用Context上下文对象获取节点信息

public void init(ServletConfig config) throws ServletException {

String servletName = config.getServletName();

System.out.println(servletName);

String initParameter = config.getInitParameter("name");

System.out.println(initParameter);

}

index.html

默认首页列表

httpServlet

httpServlet实现了servlet接口,并实现servlet方法。

在httpServlet继承的父级类中实现的service方法 判断是get请求还是post请求然后执行doGet 或 doPost方法

http://localhost:9999/servlet/QUickStartServletExtends?username=1&password=2

public class QUickStartServletExtends extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {

String username = request.getParameter("username");

String password = request.getParameter("password");

response.getWriter().write("doget..." + username + "pass:" + password);

}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {

response.getWriter().write("dopost...");

}

}

HttpServletResponse

response.setStatus(302); //设置状态码

//添加响应头

response.addHeader("name","zhangsan");

response.addIntHeader("age",18);

response.addDateHeader("date",System.currentTimeMillis());

//修改已有的响应头

response.setHeader("name","lisi");

response.setIntHeader("",0);

response.setDateHeader("",0L);

重定向:

response.setStatus(302);

response.setHeader("Location","/servlet/QuickStartServlet");

方法:response.sendRedirect("/servlet/QuickStartServlet");

设置响应体

//设置编码

response.setCharacterEncoding("gb2312");

PrintWriter writer = response.getWriter();

writer.write("

试试printwriter

");

字节输出流

ServletOutputStream st = response.getOutputStream();

HttpServletRequest

在创建Servlet时,会重写service方法或doGet、doPost方法,这些方法都有两个参数一个是request请求一个是response响应

service方法中的request的类型是ServletRequest,而doGet、doPost方法的request类型是HttpServletRequest ,HttpServletRequest是ServletRequest的子接口。

1.通过request获得请求行

String method = request.getMethod();

String uri = request.getRequestURI();

StringBuffer url = request.getRequestURL();

String contextPath = request.getContextPath();

//get请求的参数

String param = request.getQueryString();

PrintWriter writer = response.getWriter();

writer.println("method:" + method);

writer.println("uri:" + uri);

writer.println("url:" + url);

writer.println("contextPath:" + contextPath);

writer.println("param:" + param);

method:GET uri:/servlet/QUickStartServletExtends url:http://localhost:9999/servlet/QUickStartServletExtends contextPath:/servlet param:name=david&pass=123

2.通过request获得请求头

String header = request.getHeader("User-Agent");

System.out.println(header);

Enumeration headerNames= request.getHeaderNames();

while(headerNames.hasMoreElements()){

String headerName = headerNames.nextElement();

writer.println(headerName);

String headerValue = request.getHeader(headerName);

writer.println(headerValue);

}

3.通过request获得请求体

//获得指定参数

String name = request.getParameter("name");

String pass = request.getParameter("pass");

writer.println(name);

writer.println(pass);

//获得多个值

String[] parms = request.getParameterValues("checkbox");

for(String s : parms){

writer.println(s);

}

//获得所有请求参数名称

Enumeration paramsNames = request.getParameterNames();

while(paramsNames.hasMoreElements()){

writer.println(paramsNames.nextElement());

}

//获得所有参数键值对集合

Map<String,String[]> maps = request.getParameterMap();

for(Map.Entry<String,String[]> entry : maps.entrySet()){

writer.println(entry.getKey());

for(String s : entry.getValue()){

writer.println(s);

}

writer.println("-------");

}

地址转发 与302重定向区别是 地址不发生改变

RequestDispatcher dis = request.getRequestDispatcher("/path");

dis.forward(request,response);

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
2年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
AndroidStudio封装SDK的那些事
<divclass"markdown\_views"<!flowchart箭头图标勿删<svgxmlns"http://www.w3.org/2000/svg"style"display:none;"<pathstrokelinecap"round"d"M5,00,2.55,5z"id"raphael
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这