Servlet学习之请求处理,乱码问题
Servlet的请求处理
如何使用Servlet对浏览器发来的请求进行处理呢?
- request对象
- response对象
- Servlet的使用流程
request对象
问题:
浏览器发送请求到服务器,会遵循Http协议将请求数据发送给服务器,服务器用什么方法去存储呢,在存储过程中必然要保证请求数据的完整性,如何实现呢?
解决:
在java编程中,想到存储数据我们能够想到的就是使用变量,或常量或使用对象来存储数据,在servlet中采取的就是使用对象来存储数据,对于请求数据使用request来存储数据,对于回应数据使用response来存储.服务器在没接收到一个请求后,就会创建一个对象专门存储此次的请求数据.
解释:
服务器在接收到浏览器的请求后,会创建一个Request对象,存储此次相关的请求数据.服务器在调用servlet时会将Request对象作为实参传递给Servlet方法.(例如:service方法)
request对象的常见使用:
1.获取请求方式
2.获取协议
3.获取请求URL
4.获取请求URI
5.获取指定的请求行信息
5.获取所有的请求行的键值
6.获取用户数据
package cn.csuft.poorguy; import java.io.IOException; import java.util.Enumeration; 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("/MyServletText") public class MyServletText extends HttpServlet{ @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取请求头数据 //获取请求方式 String method = req.getMethod(); System.out.println("请求方式为: "+method); //获取协议 String scheme = req.getScheme(); System.out.println("协议为: "+scheme); //获取请求URL StringBuffer url = req.getRequestURL(); System.out.println("请求URL: "+url); //获取URI String uri = req.getRequestURI(); System.out.println("请求URI: "+uri); //获取请求行数据 //获取指定的请求行信息 String value = req.getHeader("connection"); System.out.println("connection:"+value); //获取所有请求行的键的枚举 Enumeration e = req.getHeaderNames(); while (e.hasMoreElements()) { System.out.println(e.nextElement()); } //获取用户数据 String name = req.getParameter("name"); } }
运行结果:
请求方式为: GET 协议为: http 请求URL: http://localhost:8080/MyServletText/MyServletText 请求URI: /MyServletText/MyServletText connection:Keep-Alive accept accept-language cache-control ua-cpu accept-encoding user-agent host connection
使用:
1.获取请求头数据
2.获取请求行数据
3.获取用户数据
response对象
问题:
再servlet处理完请求数据后,如何响应到浏览器上呢?
解决:
使用response对象
解释:
服务器再调用指定的servlet进行请求处理时,会给Servlet的方法传递两个参数,一个时request对象,一个是response对象.其中request中存储了请求的相关数据,response则是用来响应的一个对象.
response对象的常用方法:
1.设置编码方式
2.设置请求头
3.设置错误信息
4.设置输出信息到浏览器
package cn.csuft.poorguy; import java.io.IOException; import java.util.Enumeration; 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("/MyServletText") public class MyServletText extends HttpServlet{ @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置编码方式 resp.setCharacterEncoding("utf-8"); //设置请求头(同一个键名会替换) resp.setHeader("mouse", "two fly birds"); resp.setHeader("mouse", "asus"); //设置请求头(同一个键名,不替换) resp.addHeader("key", "thinkpad"); resp.addHeader("key", "wollow"); //设置错误信息 //resp.sendError(404, "this method is not supported"); //设置输出打印到浏览器 resp.getWriter().write("<h1>今天天气很好,适合学习</h1>"); } }
运行结果:
注意:
由上面的浏览器请求头可以看出,使用setHeader会使相同键的值进行替换,使用addHeader会使相同键的值不替换.
乱码问题解决
- 使用String进行重新编码
- Get方式的请求
- Post方式的请求
- 设置响应编码格式
使用String进行重新编码
uname = new String(uname.getBytes("iso8859-1"),"utf-8");
Get方式的请求
在service方法中使用: req.setCharacterEncoding(“utf-8”);
在tomcat服务器目录下的conf文件下找到server.xml文件,
打开进 行如下配置:
Post方式的请求
在service方法中使用: req.setCharacterEncoding(“utf-8”);
设置响应编码格式
在service方法中使用: resp.setCharacterEncoding(“utf-8”);
Servlet的使用流程
流程:
1.设置请求编码格式
2.设置响应编码格式
3.获取请求信息
4.处理请求信息
5.响应处理结果
数据流转流程:
浏览器------>服务器------->数据库
浏览器<------服务器<-------数据库
解释:
浏览器与服务器之间的数据传输会用到Http协议
再服务器处理请求时会用到数据库