【JavaWeb】Servlet的应用全面讲解(二)获取请求和进行响应
- 一、request 请求
- (一)获取请求
- (二)解决获取请求时发生乱码的问题
- 1. 原因和解决方法
- 2. 代码演示
- (三)请求转发跳转
- 1. 方法和特点
- 2. 代码演示
- (四)request作用域
- 1. request作用域的应用方法
- 2.代码演示
- 二、response 响应
- (一)response的应用
- 1. 方法
- 2. 代码演示
- (二)解决response应用时发生乱码问题
- 1. 原因和解决方法
- 2. 代码演示
- (三)response 进行重定向跳转
- 1. 重定向说明
- 2. 代码演示
- 3. 重定向和转发跳转的区别
一、request 请求
(一)获取请求
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*常用方法*/
//获取请求时的完整路径(从http开始,到“?"前面结束)
String url = req.getRequestURL() + "";
System.out.println("获取请求时的完整路径:" + url);
//获取请求时的部分路径(从项目的站名开始,到”?“前面结束)
String uri = req.getRequestURI();
System.out.println("获取项目部分路径:" + uri);
//获取请求的参数字符串(从”?“后面开始,到最后的字符串)
String queryString = req.getQueryString();
System.out.println("获取请求时的参数字符串:" + queryString);
//获取请求方式(Get和Post)
String method = req.getMethod();
System.out.println("获取请求方法" + method);
//获取当前协议版本(HTTP/1.1)
String protocol = req.getProtocol();
System.out.println("获取当前协议版本:" + protocol);
//获取项目的站点名(项目对外访问路径)
String webapp = req.getContextPath(); //上下文路径
System.out.println("" + webapp);
/*获取请求的参数*/
//获取指定名称的参数值,返回字符串 (重点!)
String uname = req.getParameter("uname");
String upwd = req.getParameter("upwd");
System.out.println("uname:" + uname + ".upwd:" + upwd);
//获取指定名称的参数的所有参数值,返回字符串数组(用于复选框传值)
String[] hobbys = req.getParameterValues("hobby");
//判断数组是否为空
if(hobbys != null && hobbys.length > 0){
for (String hobby: hobbys) {
System.out.println("爱好:"+ hobby);
}
}
}
(二)解决获取请求时发生乱码的问题
1. 原因和解决方法
/**
* 乱码原因:
* 由于在解析过程中默认使用的编码方式为:ISO-8859-1(此编码不支持中文),所以解析一定会出现乱码。
*
* 请求乱码问题
* Tomcat8.0以上版本 TOmcat7及以下版本
* GET请求 不会乱码 会乱码,需要手动设置转码
* new String(req.getParameter(name).getBytes("ISO-8859-1"),"UTF-8");
*
*
* POST请求 会乱码,通过设置服务器解析编码的格式 会乱码,通过设置服务器解析编码的格式
* req.setCharacterEncoding("UTF-8"); req.setCharacterEncoding("UTF-8");
*
*
* 乱码情况:
* POST请求:无论什么版本的服务器,post请求都会乱码。(req.setCharacterEncoding("UTF-8");)
*
* 注:
* 1. req.setCharacterEncoding("UTF-8"); 只针对POST请求乱码
* 2. new String(req.getParameter(name).getBytes("ISO-8859-1"),"UTF-8")针对任何请求方式。
* 但若是数据本身不乱码,还仍旧使用该方法转换,则会乱码。
*/
2. 代码演示
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求的编码格式,解决POST请求获取参数时出现乱码的问题
req.setCharacterEncoding("UTF-8");
//获取客户端传递的参数
String uname = req.getParameter("uname");
String upwd = req.getParameter("upwd");
System.out.println("姓名:" + uname);
System.out.println("密码:" + upwd);
/* //解决Tomcat7及以下版本的GET请求获取参数时出现乱码的问题
String name = new String(req.getParameter("uname").getBytes("ISO-8859-1"),"UTF-8");
System.out.println("姓名:" + name);*/
}
(三)请求转发跳转
1. 方法和特点
/**
* 请求转发跳转
* req.getRequestDispatcher("s04").forward(req,resp);
* 可以让请求从服务端跳转到客户端(或跳转到指定Servlet)
*
* 特点:
* 1. 服务端行为
* 2. 地址栏不发生改变
* 3. 从始至终只有一个请求
* 4,request数据可以共享
*/
2. 代码演示
(1)发出请求跳转的Servlet类
@Override
@WebServlet("/ser13")
public class Servlet13 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//接收客户端请求的参数
String uname = req.getParameter("uname");
System.out.println("Servlet13 uname : "+ uname);
//请求转发跳转到Servlet04
//req.getRequestDispatcher("s14").forward(req,resp);
//请求跳转到jsp页面
req.getRequestDispatcher("login.jsp").forward(req,resp);
}
}
(2)接受其它Servlet跳转的Servlet类,接收到相应的request和respond对象
/**
* 接受Servlet13的跳转
*/
@WebServlet("/ser14")
public class Servlet14 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//接收客户端请求的参数
String uname = req.getParameter("uname");
System.out.println("Servlet14 uname : "+ uname);
}
}
(四)request作用域
1. request作用域的应用方法
/**
* request作用域
* 通过该对象在一个请求中传递数据,作用范围:在一次请求中有效,即服务器跳转有效。(请求转发跳转时有效)
* //设置对象内容
* req.setAttribute(String name,Object value);
* //获取对象内容
* req.getAttribute(String name);
* //删除域对象内容
* req.removeAttribute(String name);
*/
request域中的值可以通过请求转发,在其它Servlet或者jsp页面被调用
2.代码演示
(1)设置request域对象,进行请求转发
@WebServlet("/ser15")
public class Servlet15 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Servlet15...");
//设置对象内容
req.setAttribute("name","admin");
req.setAttribute("age",18);
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
req.setAttribute("list",list);
//请求转发跳转到Servlet16
//req.getRequestDispatcher("ser16").forward(req,resp);
//请求转发跳转到jsp 并通过域对象传递数据
req.getRequestDispatcher("index.jsp").forward(req,resp);
}
}
(2)获取request域对象的Servlet
@WebServlet("/ser16")
public class Servlet16 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Servlet16...");
//获取域对象内容
String name = (String) req.getAttribute("name");
System.out.println("name :"+name);
Integer age = (Integer) req.getAttribute("age");
System.out.println("age :"+age);
List<String> list = (List<String>) req.getAttribute("list");
System.out.println(list.get(0));
}
}
(3)获取request域对象的jsp页面
<%@ page import="java.util.List" %>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>JSP - Hello World</title>
</head>
<body>
<h2>index页面</h2>
<%-- 如果要在jsp中写Java代码,需要写在脚本段中 --%>
<%
//获取参数,request.getParameter("uname")是获取页面表单get/post到Servlet的数据
String uname = request.getParameter("uname");
//获取request作用域
String upwd = (String) request.getAttribute("upwd");
//输出内容
out.print(uname);
out.print(".....");
out.print(upwd);
%>
</body>
</html>
二、response 响应
(一)response的应用
1. 方法
/**
* 响应数据
* getWrite() 字符输出流(输出字符串)
* getOutputStream 字节输出流(输出一切数据)
*
* 两种流不可同时使用,若同时使用则会报错
*/
2. 代码演示
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*getWrite() 字符输出流 (输出字符串)*//*
//获取字符输出流
PrintWriter writer = resp.getWriter();
//输出数据
writer.write("Hello");*/
/*getOutputStream 字节输出流(输出一切数据)*/
// 得到字节输出流
ServletOutputStream out = resp.getOutputStream();;
//输出数据
out.write("Hi".getBytes());
}
(二)解决response应用时发生乱码问题
1. 原因和解决方法
/**
* 字符流响应数据
* 乱码原因:
* 对于getWrite()获取到的字符流,响应中文必定出现乱码。由于在服务器端在进行编码的过程中默认使用的编码方式为:ISO-8859-1(此编码不支持中文),所以解析一定会出现乱码。
*
* 乱码解决:
* 1. 设置服务端编码格式
* resp.setCharacterEncoding("UTF-8");
* 2.设置服务端编码格式
* resp.setHeader("content-type","text/html;charset=UTF-8");
* 总结:设置客户端和服务端的编码都支持中文,且保持一致
*
* 同时设置客户端和服务端的编码样式
* resp.setContentType("text/html;charset=UTF-8");
*/
2. 代码演示
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*//设置服务端编码格式
resp.setCharacterEncoding("UTF-8");
//设置客户端的编码格式和相应的MIME类型
resp.setHeader("content-type","text/html;charset=UTF-8");*/
//同时设置客户端和服务端的编码样式
resp.setContentType("text/html;charset=UTF-8");
/*getWrite() 字符输出流 (输出字符串)*/
//获取字符输出流
PrintWriter writer = resp.getWriter();
//输出数据
writer.write("<h2>你好</h2>");
}
(三)response 进行重定向跳转
1. 重定向说明
/**
* 重定向
* 服务端指导,客户端行为
* 存在两次请求
* 地址栏会发生改变
* request对象不共享
*/
2. 代码演示
(1)跳转演示request对象不共享
例:跳转到Servlet的ser24站点
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Servlet24...");
//接收参数
String uname = req.getParameter("uname");
System.out.println("Servlet24 : " + uname);
//重定向跳转ser25
resp.sendRedirect("ser25");
}
接收跳转的ser25站点
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Servlet25...");
//接收参数
String uname = req.getParameter("uname");
System.out.println("Servlet25 : " + uname);
}
重定向后,无法接收到request对象
3. 重定向和转发跳转的区别
/**
* 重定向和转发跳转的区别
* 1。请求转发的地址栏不会发生改变,重定向的地址栏才会发生改变
* 2.请求转发只有一次请求,而重定向有两次请求
* 3.请求转发时request对象可共享,重定向时则不共享
* 4.请求转发是服务端行为,重定向是客户端行为
* 5.请求转发时的地址只能是当前站点下(当前项目)的资源,重定向地址可以是任何地址
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Servlet25...");
//接收参数
String uname = req.getParameter("uname");
System.out.println("Servlet25 : " + uname);
//设置request对象
req.setAttribute("upwd","123456");
//请求转发
//req.getRequestDispatcher("index.jsp").forward(req,resp);
//重定向
//resp.sendRedirect("index.jsp");
//重定向跳转到百度
//resp.sendRedirect("http://www.baidu.com");
//请求转发到百度,(404)
//req.getRequestDispatcher("http://www.baidu.com").forward(req,resp);
}