Servlet学习
1. Servlet的生命周期
1.1 生命周期
生命周期:一个对象从创建到销毁过程。
1.2 Servlet的生命周期
Servlet生命周期:Servlet对象从创建到销毁的过程。
Servlet中有init,service,destroy方法,这几个方法称为是Servlet生命周期相关的方法。
Servlet是在第一次被访问的时候会被实例化,只要Servlet一被实例化那么Servlet中的init方法就会执行(init只会执行一次)。任何一次从客户端发送来的请求,那么Servlet中的service方法就会执行(在service方法的内部根据请求的方式不同调用不同doXXX方法)。当Servlet从服务器中移除或者服务器关闭的时候Servlet对象被销毁,里面的destroy方法就会执行,然后垃圾回收就会将其回收掉。
1.3 代码演示Servlet的生命周期
1.3.1代码实现
package ServletLive;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class Servletlive01 implements Servlet{
@Override
/*
* Servlet对象实例化是执行,只执行一次
*/
public void init(ServletConfig config) throws ServletException {
System.out.println("init01.......");
}
@Override
/*
* 每一次请求都会执行,可执行多次
*/
public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException {
System.out.println("service01.......");
}
@Override
/*
* Servlet从服务器移除或者服务器关闭的时候执行,只执行一次
*/
public void destroy() {
System.out.println("destroy01.......");
}
@Override
public ServletConfig getServletConfig() {
// TODO 自动生成的方法存根
return null;
}
@Override
public String getServletInfo() {
// TODO 自动生成的方法存根
return null;
}
}
1.3.2 web.xml配置
<servlet>
<servlet-name>Servletlive01</servlet-name>
<servlet-class>ServletLive.Servletlive01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servletlive01</servlet-name>
<url-pattern>/Servletlive01</url-pattern>
</servlet-mapping>
2. Servlet的启动时加载
2.1 为什么要使用启动时加载
Servlet对象是第一次被访问的时候会被创建的,init方法就会执行。假设在init方法中做了一些比较耗时的操作(比如:加载了一些配置文件并且解析可能需要花费3秒钟)。第一个用户第一次访问这个Servlet的时候,需要等待3秒钟。
2.2 什么是启动时加载
Servlet默认是在第一次访问的时候创建的对象,现在通过一个配置将Servlet的实例化的过程放在服务器启动的时候(让服务器启动的时候创建Servlet的对象)。如果现在这样做那么之前花费的时间就会在服务器启动的时候一起花费掉了。对于用户来讲就不需要额外花费这个时间。
2.3 配置完成启动时加载
2.3.1代码实现
package ServletLive;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class Servletlive02 implements Servlet{
@Override
/*
* Servlet对象实例化是执行,只执行一次
*/
public void init(ServletConfig config) throws ServletException {
System.out.println("init02.......");
}
@Override
/*
* 每一次请求都会执行,可执行多次
*/
public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException {
// System.out.println("service02.......");
}
@Override
/*
* Servlet从服务器移除或者服务器关闭的时候执行,只执行一次
*/
public void destroy() {
// System.out.println("destroy02.......");
}
@Override
public ServletConfig getServletConfig() {
// TODO 自动生成的方法存根
return null;
}
@Override
public String getServletInfo() {
// TODO 自动生成的方法存根
return null;
}
}
2.3.2 web.xml配置
<servlet>
<servlet-name>Servletlive02</servlet-name>
<servlet-class>ServletLive.Servletlive02</servlet-class>
<!-- 启动优先级,一打开服务器就启动init,数字越小优先级越高,必须是“大于1”的正整数! -->
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Servletlive02</servlet-name>
<url-pattern>/Servletlive02</url-pattern>
</servlet-mapping>
3. Servlet的访问路径的配置
3.1 Servlet中的urlPattern的配置
3.1.1 完全路径匹配
以 / 开始 比如:/ServletDemo1 或 /aaa/ServletDemo2
<servlet>
<servlet-name>Servletlive03</servlet-name>
<servlet-class>ServletLive.Servletlive03</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servletlive03</servlet-name>
<url-pattern>/aaa/ServletDemo3</url-pattern>
</servlet-mapping>
访问方式:http://localhost:8080/web01/aaa/ServletDemo3
3.1.2 目录匹配
以 / 开始,以 /结束 比如:/ /aaa/* /aaa/bbb/*
<servlet>
<servlet-name>Servletlive03</servlet-name>
<servlet-class>ServletLive.Servletlive03</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servletlive03</servlet-name>
<url-pattern>/aaa/*</url-pattern>
</servlet-mapping>
访问方式:http://localhost:8080/web01/aaa/ab
3.1.3 扩展名匹配
不能以 / 开始,以开始 比如:.action 或 *.do 或 *.jsp
<servlet>
<servlet-name>Servletlive03</servlet-name>
<servlet-class>ServletLive.Servletlive03</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servletlive03</servlet-name>
<url-pattern>*.c</url-pattern>
</servlet-mapping>
访问方式:http://localhost:8080/web01/abc/a.c
4. ServletConfig对象
4.1 ServletConfig对象的概述
ServletConfig用来获得Servlet的相关的配置的对象。
4.2 ServletConfig对象的API
- 获得Servlet的初始化参数
- 获得ServletContext对象
- 获得Servlet的名称
4.3 代码演示ServletConfig的API
4.3.1 配置初始化参数
<servlet>
<servlet-name>Servletlive04</servlet-name>
<servlet-class>ServletLive.Servletlive04</servlet-class>
<!-- 配置Servlet初始化参数 -->
<init-param>
<param-name>user</param-name>
<param-value>nsc</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Servletlive04</servlet-name>
<url-pattern>/Servletlive04</url-pattern>
</servlet-mapping>
4.3.2 代码实现
package ServletLive;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Servletlive04 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletConfig config=this.getServletConfig();
//1.获得初始化化参数api
String user=config.getInitParameter("user");
String password=config.getInitParameter("password");
System.out.println(user+" "+password);
//2.获得所有初始化化参数的名称
Enumeration<String> names= config.getInitParameterNames();
while(names.hasMoreElements()) {
String name=names.nextElement();
String value=config.getInitParameter(name);
System.out.println(name+" "+value);
}
//3.获得Servlet自身名称
String servletname=config.getServletName();
System.out.println(servletname);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
5. ServletContext对象
5.1 什么是ServletContext
ServletContext:Servlet的上下文对象。ServletContext对象对Servlet之前和之后的内容都知道。这个对象一个web项目只有一个。在服务器启动的时候为每个web项目创建一个单独的ServletContext对象。
5.2 ServletContext对象的作用
5.2.1 获取web项目信息
一个web项目只有一个ServletContext对象,所以这个对象对整个项目的相关内容都是了解的。
5.2.1.1全局初始化参数
<!-- 全局初始化参数配置 -->
<context-param>
<param-name>username</param-name>
<param-value>root</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>123456</param-value>
</context-param>
5.2.1.2 方法
package ServletLive;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* ServletConntext对象作用一:获取web项目信息
*/
@WebServlet("/Servletlive5")
public class Servletlive05 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取文件的mime类型
//获得Servletcontext
ServletContext servletcontext=this.getServletContext();
String mimetype = servletcontext.getMimeType("*.txt");
System.out.println(mimetype);
//2.获得请求路径的工程名
String path=servletcontext.getContextPath();
System.out.println(path);
//3.获得全局初始化参数
String username = servletcontext.getInitParameter("username");
String password = servletcontext.getInitParameter("password");
System.out.println(username+" : "+password);
Enumeration<String> names=servletcontext.getInitParameterNames();
while(names.hasMoreElements()) {
String name=names.nextElement();
String value=servletcontext.getInitParameter(name);
System.out.println(name+" : "+value);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
5.2.2 读取web项目信息
之前使用IO流就可以读取文件(java项目中)。现在是一个web项目,web项目需要发布到tomcat下才能访问的。获取web项目下的文件如果使用传统的IO就会出现问题(原因:路径中使用的是相对路径,相对的是JRE环境)。
5.2.2.1 文件存放
5.2.2.2 代码演示
package ServletLive;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class Servletlive06
*/
@WebServlet("/Servletlive06")
public class Servletlive06 extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//chuantongfangfa();
zhengquefangfa();
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
/**
* 读取web项目文件:用ServletContext
*/
private void zhengquefangfa() throws FileNotFoundException, IOException {
// 使用ServletContext方式
Properties properties=new Properties();
//创建一个文件输入流
//方式1
// InputStream in =this.getServletContext().getResourceAsStream("/WEB-INF/db.properties");
// properties.load(in);
//方式2
String path =this.getServletContext().getRealPath("/WEB-INF/db.properties");
InputStream in =new FileInputStream(path);
System.out.println(path);
properties.load(in);
//获取数据
String driverClassName =properties.getProperty("driverClassName");
String url =properties.getProperty("url");
String username =properties.getProperty("username");
String password =properties.getProperty("password");
//输出
System.out.println(driverClassName);
System.out.println(url);
System.out.println(username);
System.out.println(password);
}
/**
* 传统方法读取文件不可用
*/
private void chuantongfangfa() throws FileNotFoundException, IOException {
// 传统方式
Properties properties=new Properties();
//创建一个文件输入流
InputStream in =new FileInputStream("db/db.properties");//相对路径,对应tomcat/bin目录下
properties.load(in);
//获取数据
String driverClassName =properties.getProperty("driverClassName");
String url =properties.getProperty("url");
String username =properties.getProperty("username");
String password =properties.getProperty("password");
//输出
System.out.println(driverClassName);
System.out.println(url);
System.out.println(username);
System.out.println(password);
}
}
6. ServletContext对象作为域对象存取数据
6.1 什么是域对象
域对象:指的是将数据存入到域对象中,这个数据就会有一定的作用范围。域指的是一定的作用范围。
6.2 ServletContext作为域对象的API
- 存入数据的方法
- 获取数据的方法
- 移除数据的方法
6.3 ServletContext作为域对象的作用范围
ServletContext是在服务器启动的时候为每个web项目单独创建一个ServletContext对象。当web项目从服务器中移除,或者是关闭服务器的时候ServletContext对象会被销毁。向ServletContext中保存的数据一直存在(当服务器关闭的时候ServletContext对象被销毁,然后里面数据才会失效)。范围:整个web应用。
6.4 ServletContext域对象代码演示
package ServletDemo;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/ServletDemo1")
public class ServletDemo1 extends HttpServlet {
public void init() throws ServletException{
//当ServletDemo7被创建的时候初始化一个值
this.getServletContext().setAttribute("name", "子陌");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name=(String)this.getServletContext().getAttribute("name");
System.out.println("姓名:"+' '+name);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
package ServletDemo;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/ServletDemo2")
public class ServletDemo2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name=(String)this.getServletContext().getAttribute("name");
System.out.println("姓名:"+' '+name);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
7. Response对象
7.1 什么是Response
开发的软件是B/S结构的软件,可以通过浏览器访问服务器的软件。从浏览器输入一个地址访问服务器(将这个过程称为是请求)。服务器接收到请求,需要进行处理,处理以后需要将处理结果显示回浏览器端(将这个过程称为是响应)。
7.2 Response关于响应行的方法
状态码 | 对应的响应 |
---|---|
200 | 正确 |
302 | 重定向 |
304 | 查找本地缓存 |
404 | 请求资源不存在 |
500 | 服务器内部错误 |
7.3 Response关于响应头的方法
7.3.1 set开头的方法:针对一个key对应一个value的情况。
举例:比如有一个头 “content-Type” : "text/html"
setHeader(“content-Type”,”text/plain”);
最终得到头的结果:“content-Type” : "text/plain"
7.3.2 add开头的方法:针对一个key对应多个value的情况。
举例:比如有一个 “content-Type” : "text/html"
addHeader(“content-Type”,”text/plain”);
最终得到头的结果:“content-Type” : “text/html” , "text/plain"
7.4 Response关于响应体的方法
7.5 Response其他的API
7.5.1 重定向的方法
7.5.2 设置浏览器打开页面时候采用的字符集
7.5.3 设置响应字符流的缓冲区字符集
7.5.4 服务器向浏览器回写Cookie的方法
7.6 Response对象的API的代码演示
package ResponseDemo;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 设置响应状态码
* 使用状态码和Location头完成重定向
* 定时刷新
*/
@WebServlet("/Responsedemo1")
public class Responsedemo1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// //设置响应状态码
// response.setStatus(404);
// //完成重定向
// response.setStatus(302);
// //设置响应头
// response.setHeader("Location", "/web01/Responsedemo2");
// 实际开发中可以使用response.sendRedirect("/web01/ResponseDemo2"”);替换重定向两句写法
//定时刷新
response.setContentType("text/html;charset=UTF-8");//中文乱码处理
response.getWriter().println("5秒后跳转!");
response.setHeader("Refresh","5;url=/web01/Responsedemo2");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
package ResponseDemo;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class REsponsedemo2
*/
@WebServlet("/Responsedemo2")
public class Responsedemo2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().println("cresponsedemo2...");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
7.7 处理中文乱码
7.7.1 字节流响应中文
private void zijieliu(HttpServletResponse response) throws IOException, UnsupportedEncodingException {
//使用字节流方式输出中文
ServletOutputStream outputStream=response.getOutputStream();
//设置中文转成字节数组字符集编码
outputStream.write("中文".getBytes());
}
***使用上述代码向页面输出中文是否会有乱码?
不一定
其实这个乱码的产生与中文转成字节数组及浏览器打开方式(打开的时候采用的默认字符集)有关
解决: 将中文转成字节数组的时候和浏览器默认打开的时候采用的字符集一致即可。
private void zijieliu(HttpServletResponse response) throws IOException, UnsupportedEncodingException {
//使用字节流方式输出中文
ServletOutputStream outputStream=response.getOutputStream();
//设置浏览器默认打开的时候采用的字符集
response.setHeader("Content-Type", "text/html;charset=UTF-8");
//设置中文转成字节数组字符集编码
outputStream.write("中文".getBytes("UTF-8"));
}
7.7.2 字符流响应中文
private void zifuliu(HttpServletResponse response) throws IOException, UnsupportedEncodingException {
response.getWriter().println("中文");
}
***使用上述代码向页面输出中文是否会产生乱码?
一定乱码
原因:字符流是有缓冲区的,response获得字符流,response设计默认的缓冲区编码是ISO-8859-1。这个字符集不支持中文的。
解决: 设置response获得字符流缓冲区的编码和设置浏览器默认打开时候采用的字符集一致即可。
private void zifuliu(HttpServletResponse response) throws IOException, UnsupportedEncodingException {
// //设置浏览器默认打开的时候采用的字符集
// response.setHeader("Content-Type", "text/html;charset=UTF-8");
// //设置response获得字符流缓冲区的编码
// response.setCharacterEncoding("UTF-8");
// 简化上面两句
response.setContentType("text/html;charset=UTF-8");
response.getWriter().println("中文");
}
8. Request对象
8.1 什么是Request对象
开发的软件都是B/S结构软件,从浏览器向服务器提交一些数据,将这些内容进行封装就封装成了一个请求对象(Request对象)。
8.2 Request对象的API
8.2.1 获得客户机信息
-
获得请求的方式
-
获得请求路径后的提交参数的字符串
-
获得请求路径的URL和URI
-
获得客户机的IP地址
8.2.2 获得请求头的方法
-
获得一个key对应一个value的请求头
-
获得一个key对应多个value的请求头
8.2.3 获得请求参数的方法
-
获得提交的参数(一个name对应一个value)
-
获得提交的参数(一个name对应多个value)
-
获得提交的参数,将提交的参数的名称和对应的值存入到一个Map集合中
8.2.4 Request作为域对象存取数据的方法
-
向request域中存数据
-
从request域中获取数据
-
从request域中移除数据
8.2.5 Request请求转发方法
- 通过ServletRequest对象获得RequestDispatcher对象
- 再根据RequestDispatcher中的方法进行请求转发
8.3 Request对象的部分API的代码演示
package RequestDemo;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*Request对象获得客户机信息
*/
@WebServlet("/Requestdemo1")
public class Requestdemo1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获得请求方式
System.out.println("请求方式:"+request.getMethod());
//获得客户机ip地址
System.out.println("客户机ip:"+request.getRemoteAddr());
//获得请求参数的字符串
System.out.println("请求参数字符串:"+request.getQueryString());
//请求路径的URL和URI
System.out.println("请求路径的URL"+request.getRequestURL());
System.out.println("请求路径的URL"+request.getRequestURI());
//获得请求头信息
System.out.println("获得客户机浏览器类型:"+request.getHeader("User-Agent"));
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
8.4 Request对象接收表单请求参数
8.4.1静态页面
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>request接收表单参数</h1>
<form action="/web01/Requestdemo2" method="post">
用户名:<input type="text" name="username"/><br/>
密码:<input type="password" name="password"><br/>
性别:<input type="radio" name="sex" value="man"/>男<input type="radio" name="sex" value="woman"/>女<br/>
籍贯:<select name="city">
<option value="beijing">北京市</option>
<option value="shanghai">上海市</option>
<option value="shenzhen">深圳市</option>
</select><br/>
爱好:<input type="checkbox" name="hobby" value="basketball"/>篮球
<input type="checkbox" name="hobby" value="football"/>足球
<input type="checkbox" name="hobby" value="volleyball"/>排球<br/>
自我介绍:<textarea name="info" rows="3" cols="8"></textarea><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
8.4.2 接收请求参数
package RequestDemo;
import java.io.IOException;
import java.util.Arrays;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class Requestdemo2
*/
@WebServlet("/Requestdemo2")
public class Requestdemo2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//接收
String username=request.getParameter("username");
String password=request.getParameter("password");
String sex =request.getParameter("sex");
String city =request.getParameter("city");
String[] hobby = request.getParameterValues("hobby");
String info =request.getParameter("info");
//输出
System.out.println("username: "+ username );
System.out.println("password: "+password);
System.out.println("sex: "+sex);
System.out.println("city: "+city);
System.out.println("hobby"+Arrays.toString(hobby));
System.out.println("info"+info);
//使用getParamerMap接收数据
Map<String,String[]> map =request.getParameterMap();
for (String name:map.keySet()) {
String[] value = map.get(name);
System.out.println(name+" : "+Arrays.toString(value));
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
8.5 Request对象接收表单请求参数的中文乱码处理
8.5.1静态页面
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>request接收中文数据</h1>
<h3>GET方式接收中文</h3>
<form action="/web01/Requestdemo3" method="get">
姓名:<input type="text" name="name"/><br/>
<input type="submit" value="提交">
</form>
<h3>POST方式接收中文</h3>
<form action="/web01/Requestdemo3" method="post">
姓名:<input type="text" name="name"/><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
8.5.2 接收中文请求参数
package RequestDemo;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Request接收中文数据
*/
@WebServlet("/Requestdemo3")
public class Requestdemo3 extends HttpServlet {
/*
* get方式处理中文乱码
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//接收数据
/*
* 产生乱码原因:
* get方式提交的数据再请求行url后面,再地址栏上其实就已经进行了一次URL编码
* 解决方案:
* 将存入request缓存区的值获取,再以UTF-8的方式进行解码。
*/
String name=request.getParameter("name");
String decode = URLDecoder.decode(name, "UTF-8");
System.out.println("姓名:"+decode);
//或者
String value = new String(name.getBytes(),"UTF-8");
System.out.println("姓名:"+value);
}
/*
* post方式处理中文乱码
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//接收数据
/*
* 产生乱码原因:
* post方式请求数据再请求体中,request对象接收到数据的时候,放入request的缓冲区,缓冲区采用的默认编码不支持中文
* 解决方法:
* 将request的缓冲区编码修改成支持中文的utf-8
*/
request.setCharacterEncoding("UTF-8");
String name=request.getParameter("name");
System.out.println("姓名:"+name);
}
}
9. 恭喜挑战成功!
下一关jsp!DUT-子陌在等你!