1、http协议
1.1. 概述
- HTTP(hypertext transport protocol),即超文本传输协议。这个协议详细规定了浏览器和万维网服务器之间互相通信的规则。
- 客户端与服务端通信时传输的内容我们称之为报文。
- 客户端发送给服务器的称为”请求报文 request“,服务器发送给客户端的称为”响应报文 response“
1.2. 请求方法
GET
向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中。
POST
向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT
向指定资源位置上传其最新内容。
DELETE
请求服务器删除Request-URI所标识的资源。
OPTIONS
返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送'*'的请求来测试服务器的功能性。
HEAD
向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。
TRACE
回显服务器收到的请求,主要用于测试或诊断。
CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
1.3 响应码
- 200:请求成功,浏览器会把响应体内容(通常是html)显示在浏览器中;
- 404:请求的资源没有找到,说明客户端错误的请求了不存在的资源;
- 500:请求资源找到了,但服务器内部出现了错误;
- 302:重定向,当响应码为302时,表示服务器要求浏览器重新再发一个请求,服务器会发送一个响应头Location,它指定了新请求的URL地址;
1.4 协议内容
POST提交的报文
POST /Hello/target.html HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */*
Referer: http://localhost:8080/Hello/
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: localhost:8080
Content-Length: 14
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: JSESSIONID=774DA38C1B78AE288610D77621590345
username=admin
- POST请求是可以有体的,而GET请求不能有请求体。
- Referer: http://localhost:8080/hello/index.jsp:请求来自哪个页面,例如你在百度上点击链接到了这里,那么Referer:http://www.baidu.com;如果你是在浏览器的地址栏中直接输入的地址,那么就没有Referer这个请求头了;
- Content-Type: application/x-www-form-urlencoded:表单的数据类型,说明会使用url格式编码数据;url编码的数据都是以“%”为前缀,后面跟随两位的16进制,例如“传智”这两个字使用UTF-8的url编码用为“%E4%BC%A0%E6%99%BA”;
- Content-Length:13:请求体的长度,这里表示13个字节。
- keyword=hello:请求体内容!hello是在表单中输入的数据,keyword是表单字段的名字。
2、web服务器
2.1. 概述
能够通过该应用发布网络服务的服务器,例如网站发布
2.2. 常用web服务器
- Tomcat(Apache):当前应用最广的JavaWeb服务器;
- JBoss(Redhat红帽):支持JavaEE,应用比较广;
- GlassFish(Orcale):Oracle开发JavaWeb服务器,应用不是很广;
- Resin(Caucho):支持JavaEE,应用越来越广;
- Weblogic(Orcale):要钱的!支持JavaEE,适合大型项目;
- Websphere(IBM):要钱的!支持JavaEE,适合大型项目;
2.3. 下载安装
http://tomcat.apache.org/download-80.cgi
根据你的操作系统的版本来下载对应安装文件,其实就是压缩包,解压到某个目录,就完成安装
2.4. tomcat目录
2.5. tomcat启动,停止
window :
启动startup.bat
停止shutdown.bat
linux :
启动startup.sh
停止shutdown.sh
2.5. tomcat监听的端口
服务器启动时,默认监听8080,这个端口是可配置的,文件路径在:
conf/server.xml
2.6. tomcat默认访问的应用
例如:http://localhost:8080/后台对应的程序包就是ROOT,如果没有ROOT,就需要使用http://localhost:8080/+具体的应用名称
2.7. 创建和发布动态网页
创建动态网页必要条件
hello (动态网页服务名称)
WEB-INF(必须这个名字的目录)
web.xml (必须有这个名字的配置文件)
index.html
发布
把hello目录copy到webapps目下
一个完整的动态web服务的目录
webapps
|- hello
|-WEB-INF
|-web.xml
|-classes
|-lib
|- index.html
欢迎页面(配置在web.xml)
<welcome-file-list>
<welcome-file>hello.html</welcome-file>
</welcome-file-list>
3. Servlet
3.1. 编写方式
1.实现Servlet接口
2.继承HttpServlet类
3.2. 编写步骤(实现Servlet接口)
1、实现Servlet接口
需要重写很多方法,最重要的是方法是service方法,是处理我们请求和响应的方法
service方法两个重要的参数ServletRequest req,ServletResponse resp
2、实现Servlet所有的方法
3、在web.xml配置servlet
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/helloworld</url-pattern>
</servlet-mapping>
4、发布工程
3.3. 编写步骤(HttpServlet类)
1、继承HttpServlet类(专门处理http协议的请求和响应)
需要重写两个重要的方法:doGet和doPost
doGet和doPost方法两个重要的参数HttpServletRequest req,HttpServletResponse resp
2、实现Servlet所有的方法
3、在web.xml配置servlet
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/helloworld</url-pattern>
</servlet-mapping>
4、发布工程
一般都使用继承HttpServlet的方式。
3.2. ServletConfig和ServletContext
3.2.1. ServletConfig
能够得到servlet的名字以及初始化的参数
能够得到ServletContext
3.2.2. ServletContext
每个应用对应一个ServletContext对象,所有的Servlet实例共享该对象
主要方法:
获取全局初始化参数
getInitParameter
获取服务器真实路径
getRealPath
3.3 HttpServletRequest和HttpServletResponse
3.3.1. HttpServletRequest
request获取和设置参数
1、根据参数名获取值(POST和GET):
String 参数值 = request.getParameter("参数名");
2、可以向request域设置参数
reqeuset.setAttribute("user", user);
3、可以从request与获取参数
User user = (User)request.getAttribute("user");
问:reqeust.getParameger()和request.getAttribute()的
reqeust.getParameger()返回的string
request.getAttribute()返回是Object
服务器转发
request.getRequestDispather(“/转发的地址”).forward(req,resp);
3.3.1. HttpServletResponse
向浏览器输出内容
//通过PrintWriter对象向浏览器端发送响应信息
PrintWriter writer = res.getWriter();
writer.write("Servlet response");
writer.close();
//通过OutputStream对象向浏览器端发送响应信息
OutputStream out = res.getOutputStream();
out.write("html内容".getBytes());
out.close();
重定向:
response.sendRedirect("/重定向的地址");
问:服务器转发和重定向的区别:
3.4 请求和响应乱码
3.4.1 请求乱码
1、可以在servlet里设置请求的编码格式(针对POST)
req.setCharacterEncoding("utf-8");
2、如果GET方式乱码
GET请求:GET请求参数是在地址后面的。不能使用上述方法。我们需要修改tomcat的配置文件。需要在Server.xml文件修改Connector标签,添加URIEncoding="utf-8"属性。
3.4.2 响应乱码
解决方法:
response.setContentType("text/html;charset=utf-8");
或者使用这两句组合:
response.setCharacterEncoding("utf-8")
response.setHeader("Content-Type", "text/html;charset=utf-8");
我们一般使用response.setContentType("text/html;charset=utf-8");