servlet请求和响应
一,请求对象
1.请求对象的常用方法
获取虚拟路径 getContextPath()
获取Servlet映射路径 getServletPath()
获取访问者ip地址 getRemoteAddr()
获取请求的消息数据 getQueryString()
获取统一资源标识符 getRequestURI()
获取统一资源定位符 getRequestURL()
注意:URI的范围比URL的范围要大
代码演示:
// 获取虚拟路径
String contextPath = req.getContextPath();
System.out.println(contextPath);
// 获取Servlet映射路径
String servletPath = req.getServletPath();
System.out.println(servletPath);
// 获取访问者ip地址
String remoteAddr = req.getRemoteAddr();
System.out.println(remoteAddr);
// 获取请求的消息数据
String queryString = req.getQueryString();
System.out.println(queryString);
// 获取统一资源标识符
String requestURI = req.getRequestURI();
System.out.println(requestURI);
// 获取统一资源定位符
StringBuffer requestURL = req.getRequestURL();
System.out.println(requestURL);
二,请求头信息的常用方法
根据请求头名称获取一个值 getHeader(String name)
根据请求头名称获取多个值 getHeaders(String name)
获取所有请求头名称 getHeadNames()
三,获取请求参数信息
根据名称获取数据 getParameter(String name)
根据名称获取所有数据 getParameterValues(String name)
获取所有名称 getParameterNames()
获取所有参数的键值对 getParameterMap()
代码演示:
// 根据名称获取数据
String username = req.getParameter("username");
System.out.println(username);
String password = req.getParameter("password");
System.out.println(password);
System.out.println("--------------------------");
// 根据名称获取所有数据
String[] hobbies = req.getParameterValues("hobby");
for (String hobby : hobbies) {
System.out.println(hobby);
}
System.out.println("--------------------------");
// 获取所有名称
Enumeration<String> headerNames = req.getParameterNames();
while (headerNames.hasMoreElements()){
// 获取每一个名字
String names = headerNames.nextElement();
String result = req.getParameter("names");
System.out.println(names+" " +result);
}
System.out.println("--------------------------");
// 获取所有参数的键值对
Map<String, String[]> map = req.getParameterMap();
for (String key : map.keySet()){
String[] values = map.get(key);
System.out.print(key+":");
for (String value : values) {
System.out.print(value+" ");
}
System.out.println();
}
System.out.println("--------------------------");
1.将信息封装为对象
a:getParameter(String name)和getParameterValues(String name)获取到每一个信息封装
b:用反射进行封装(太复杂)
c:先用req.getParameterMap();获取集合,导jar包用工具类 BeanUtils.populate(对象名,集合);
注意:封装的学生对象与map的值要一 一对应起来
三,用流的形式读取请求信息
代码演示:
public class RequestDemo4 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.获取请求正文的字节输入流
ServletInputStream sis = request.getInputStream();
//2.读取流中的数据
int len = 0;
byte[] by = new byte[1024];
while((len = sis.read(by)) != -1){
System.out.println(new String(by,0,len));
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
四,中文乱码问题
get在tomcat8.0之后解决了乱码问题
post:req.setCharacterEncoding("编码格式");
五,请求转发
通过方法:req.getRequestDispatcher("要实现的Servlet名称");
实现转发:requestDispatcher.forward(req,resp);
六,响应对象
改变浏览器的编码格式:resp.setContentType("text/html;charset=UTF-8");
代码演示:
public class ResponseDemo1 extends HttpServlet {
/**
* 演示字节流输出的乱码问题
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* 问题:
* String str = "字节流中文乱码问题";
* 使用字节流输出,会不会产生中文乱码?
* 答案:
* 会产生乱码
* 原因:
* String str = "字节流中文乱码问题"; 在保存时用的是IDEA创建文件使用的字符集UTF-8。
* 到浏览器上显示,chrome浏览器和ie浏览器默认的字符集是GB2312(其实就是GBK),存和取用的不是同一个码表,就会产生乱码。
*
* 引申:
* 如果产生了乱码,就是存和取用的不是同一个码表
* 解决办法:
* 把存和取的码表统一。
*/
String str = "字节流输出中文的乱码问题";//UTF-8的字符集,此时浏览器显示也需要使用UTF-8的字符集。
//1.拿到字节流输出对象
ServletOutputStream sos = response.getOutputStream();
/**
* 解决办法:
* 第一种解决办法:
* 修改浏览器的编码,使用右键——编码——改成UTF-8。(不推荐使用,我们的应用尽量不要求用户取做什么事情)
* ie和火狐浏览器可以直接右键设置字符集。而chrome需要安装插件,很麻烦。
* 第二种解决办法: (不建议使用,因为不好记)
* 向页面上输出一个meta标签,内容如下: <meta http-equiv="content-type" content="text/html;charset=UTF-8">
* 其实它就是指挥了浏览器,使用哪个编码进行显示。
* 第三种解决办法:
* 设置响应消息头,告知浏览器响应正文的MIME类型和字符集
* response.setHeader("Content-Type","text/html;charset=UTF-8");
* 第四种解决办法:我们推荐使用的办法
* 它的本质就是设置了一个响应消息头
* response.setContentType("text/html;charset=UTF-8");
*/
//第二种解决办法:sos.write("<meta http-equiv='content-type' content='text/html;charset=UTF-8'>".getBytes());
//第三种解决办法:response.setHeader("Content-Type","text/html;charset=UTF-8");
//第四种解决办法:
response.setContentType("text/html;charset=UTF-8");
//2.把str转换成字节数组之后输出到浏览器
sos.write(str.getBytes("UTF-8"));
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
七,重定向
resp.sendRedirect(req.getContextPath()+"/servletDemo02");
注意:这里的地址是要重定向的地址
八,自动跳转
// 定义字符串
resp.setContentType("text/html;charset=utf-8");
String str = "十秒后自动跳转到登录页面";
//写回
resp.getWriter().write(str);
// 跳转
resp.setHeader("Refresh","3;URL="+req.getContextPath()+"/regist.html");
推荐阅读