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协议
再服务器处理请求时会用到数据库

浙公网安备 33010602011771号