1.Servlet技术
-
什么是Servlet
- Servlet是JavaEE规范之一
- Servlet是JavaWeb三大组件之一,三大组件是:Servlet程序、Filter过滤器、Listener监听器
- Servlet是运行在服务器上的一个java小程序,可以接收客户端发来的请求,并响应数据给客户端
-
手动实现Servlet程序
- 编写一个类去实现Servlet接口
- 实现service方法,处理请求,并响应数据
- 到web.xml中去配置servlet程序的访问地址
package com.fan.servlet; import javax.servlet.*; import java.io.IOException; public class HelloServlet implements Servlet { @Override public void init(ServletConfig servletConfig) throws ServletException { } @Override public ServletConfig getServletConfig() { return null; } /** service方法专门用来处理请求和响应 **/ @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("Hello Servlet!"); } @Override public String getServletInfo() { return null; } @Override public void destroy() { } }
<!-- Servlet标签给Tomcat配置Servlet程序 --> <servlet> <!-- servlet-name 标签是Servlet程序起的一个别名,一般是类名--> <servlet-name>HelloServlet</servlet-mapping> <!-- servlet-class是Servlet程序的全类名--> <servlet-class>com.fan.servlet.HelloServlet</servlet-class> </servlet> <!-- servlet-mapping 标签给servlet程序配置访问地址 --> <servlet-mapping> <!-- servlet-name 告诉服务器,配置的地址给哪个Servlet程序使用--> <servlet-name>HelloServlet</servlet-name> <!-- url-pattern标签配置访问地址 /hello表示地址为:http://ip:port/工程路径/hello --> <url-pattern>/hello</url-pattern> </servlet-mapping>
-
Servlet的生命周期
- 执行Servlet构造器方法
- 执行init初始化方法
- 执行Service方法
- 执行destroy方法
前两步在第一次访问的时候创建Servlet程序调用,第三步每次访问都会调用,第四步在web工程停止的时候调用。
-
GET和POST请求的分发处理
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { HttpServletRequest httpServletRequest=(HttpServletRequest)servletRequest; String method=httpServletRequest.getMethod(); if(method.equals("GET")){ doGet(); } else if(method.equals("POST")){ doPost(); } } public void doGet(){ System.out.println("get方法"); } public void doPost(){ System.out.println("post方法"); }
-
通过继承HttpServlet实现Servlet程序
- 编写一个类去继承HttpServlet类
- 根据业务需要重写doGet或doPost方法
- 到web.xml中配置Servlet程序的访问地址
public class HelloServlet2 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doGet"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doPost"); } }
-
Servlet类的继承体系
2.ServletConfig类
Servlet程序和ServletConfig对象都是由Tomcat负责创建,Servlet程序默认是第一次访问的时候创建,ServletConfig是每个Servlet程序创建时,就创建一个对应的ServletConfig对象
- ServletConfig类的三大作用
- 可以获取Servlet程序的别名servlet-name的值
- 获取初始化参数init-param
- 获取ServletContext对象
public void init(ServletConfig servletConfig) throws ServletException {
//获取Servlet程序别名
System.out.println("HelloServlet程序的别名:"+servletConfig.getServletName());
//获取初始化参数init-param
System.out.println("初始化参数user的值:"+servletConfig.getInitParameter("user"));
//获取ServletContext对象
System.out.println(servletConfig.getServletContext());
}
3.ServletContext类
-
ServletContext概念
-
ServletContext是一个接口,表示Servlet上下文对象
-
一个web工程,只有一个ServletContext对象实例
-
ServletContext对象是一个域对象
-
ServletContext是在web工程部署启动的时候创建,在web工程停止的时候销毁
-
-
ServletContext类的四个作用
- 获取web.xml中配置的上下文参数context-param
- 获取当前的工程路径,格式:/工程路径
- 获取工程部署后在服务器硬盘的绝对路径
- 像map一样存取数据
web.xml中的配置
<!--context-param是上下文参数,属于整个web工程 --> <context-param> <param-name>username</param-name> <param-value>user</param-value> </context-param>
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context=getServletConfig().getServletContext(); //获取web.xml中配置的上下文参数context-param System.out.println("context-param参数username的值是:"+context.getInitParameter("username")); //获取当前的工程路径,格式:/工程路径 System.out.println("当前工程路径"+context.getContextPath()); //获取工程部署后在服务器硬盘上的绝对路径 System.out.println("工程部署的路径是:"+context.getRealPath("/")); }
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context=getServletConfig().getServletContext(); //获取ServletCOntext对象 context.setAttribute("key","value"); System.out.println("context中key的值是:"+context.getAttribute("key")); }
4.HTTP协议
4.1 请求的HTTP协议格式
客户端给服务器发送数据叫请求,服务器给客户端传回数据叫响应
请求分为GET请求和POST请求
GET请求
-
请求行
- 请求的方式 GET
- 请求的资源路径[+?+请求参数]
- 请求的协议版本号 HTTP/1.1
-
请求头
由key:value组成,不同的键值对,表示不同的含义
POST请求
- 请求行
- 请求的方式 POST
- 请求的资源路径[+?+请求参数]
- 请求的协议版本号 HTTP/1.1
- 请求头
- key:value 不同的请求头,有不同的含义
- 请求体 发送给服务器的数据
常用请求头的说明
- Accept:表示客户端可以接收的数据类型
- Accept-Languege:表示客户端可以接收的语言类型
- User-Agent:表示客户端浏览器的信息
- Host:表示请求时的服务器ip和端口号
GET请求与POST请求
- GET请求:
- form标签 method=get
- a标签
- link标签引入css
- Script标签引入js文件
- img标签引入图片
- iframe引入html页面
- 在浏览器输入地址栏后敲回车
- POST请求
- form标签 method=post
4.2 响应的HTTP协议格式
- 响应行
- 响应的协议和版本号
- 响应状态码
- 响应状态描述符
- 响应头
- key:value 不同的响应头,有其不同含义
- 响应体
- 回传给客户端的数据
常用的响应码说明
- 200 表示请求成功
- 302 表示请求重定向
- 404 表示请求服务器已经收到了,但是数据不存在(请求地址错误)
- 500 表示服务器已经收到请求,但是服务器内部错误(代码错误)
5.HttpServletRequest类
-
作用
每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的HTTP协议信息解析好封装到Request对象中。然后传递到service方法(doGet和doPost)中使用。可以通过HttpServletRequest对象,获取到所有请求的信息
-
HttpServletRequest类的常用方法
- getRequestURI() 获取请求的资源路径
- getRequestURL() 获取请求的统一资源定位符(绝对路径)
- getRemoteHost() 获取客户端的ip地址
- getHeader() 获取请求头
- getParameter() 获取请求的参数
- getParameterValues() 获取请求的参数(多个值的时候使用)
- getMethod() 获取请求的方式GET或POST
- setAttribute(key,value) 设置域数据
- getAttribute(key) 获取域数据
- getRequestDispatcher() 获取请求转发对象
-
doGet请求的中文乱码解决
String username=req.getParameter("username"); //先以iso8859-1进行编码,再以utf-8进行解码 username=new String(username.getBytes("iso-8859-1"),"UTF-8");
-
POST请求的中文乱码解决
设置请求体的字符集为UTF-8,从而解决post请求的中文乱码问题
req.setCharacterEncoding("UTF-8");
-
请求的转发
请求的转发是指服务器收到请求后,从一次资源跳转到另一个资源的操作
RequestDispatcher requestDispatcher=req.getRequestDispatcher("/servlet2"); requestDispatcher.farward(req,resp);
-
base标签的作用
base标签可以设置当前页面中所有相对路径工作时,参照哪个路径来进行跳转
<base href="http://localhost:8080/servlet/a/b"/>
-
web中/的不同意义
/ 被浏览器解析,得到的地址是:http://ip:port/
/被服务器解析,得到的地址是:http://ip:port/工程路径
6.HttpServletResponse类
-
HttpServletResponse类的作用
HttpServletResponse表示所有响应的信息
-
输出流
- 字节流 getOutputStream 常用于下载(传递二进制数据)
- 字符流 getWriter() 常用于回传字符串
- 两个流同时只能使用一个
-
往客户端回传数据
PrintWriter writer=resp.getWriter(); writer.write("response's content");
-
响应的乱码解决
-
方案一
//设置服务器字符集为UTF-8 resp.setCharacterEncoding("UTF-8"); //通过响应头,设置浏览器也使用UTF-8字符集 resp.setHeader("Content-Type","text/html;charset=UTF-8");
-
方案二
resp.setContentType("text/html";charset="UTF-8");
-
-
请求重定向
请求重定向,是指客户端给服务器发送请求,然后服务器告诉客户端去访问新地址
-
请求重定向的第一种方案:
//设置响应状态码302,表示重定向 resp.setStatus(302); //设置响应头,说明新的地址在哪里 resp.serHeader("Location","http://localhost:8080");
-
请求重定向的第二种方案
resp.sendRedircet("http://localhost:8080");
-