Java Web程序设计——请求和响应(三)
思维导图:
HttpServletRequest应用
获取请求参数
- 根据name属性值,获取用户输入的值:String value = getParameter(name属性对应的值);
- 根据name属性值,获取用户选择的值:String[] value = getParameterValues(name属性对应的值);
- 没有参数,获取所有值:Map<String,String[]> map = getParameterMap();
例:
package chapter.request;
import java.io.IOException;
import java.util.Arrays;
import java.util.Map;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.sun.corba.se.impl.encoding.OSFCodeSetRegistry.Entry;
/**
* Servlet implementation class RequestParamServlet
*/
public class RequestParamServlet 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 {
// 根据name属性值,获取用户输入的值
String username = request.getParameter("username");
String password = request.getParameter("password");
// 根据name属性值,获取用户选择的值
// String[] hobbys = request.getParameterValues("hobby");
// response.getWriter().println("username:"+username+"<br/>");
// response.getWriter().println("password:"+password+"<br/>");
// response.getWriter().println("hobby:"+Arrays.toString(hobbys));
// 没有参数,获取所有值
Map<String, String[]> map = request.getParameterMap();
//遍历map
Set<String> set = map.keySet();
for(String key:set) {
String[] value = map.get(key);
System.out.println("name属性的值:"+key+" "+Arrays.toString(value));
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
form.html
用浏览器打开,可看到
解决请求参数的中文乱码问题
中文乱码处理分两种情况:
- 处理get方式提交的中文乱码,使用的String的构造方法解决的中文乱码:new String(字节数组,编码格式);
- 处理post方式提交的中文乱码,post提交,会把参数首先提交到request对象的缓冲区中,缓冲区默认编码是ISO8859-1,不支持中文处理方法,把request缓冲区的编码给设置成支持中文的码表格式
例:
package chapter.request;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class RequestParamServlet
*/
public class RequestParamServlet 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 {
// 1.获取用户名
response.setContentType("text/html;charset=utf-8");
String value = request.getParameter("username");
String newvalue = new String(value.getBytes("ISO8859-1"), "utf-8");
response.getWriter().print("处理后的值:" + newvalue);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1.获取用户输入的值
// 处理请求中文的乱码问题
request.setCharacterEncoding("utf-8");
String value = request.getParameter("username");
System.out.println(value);
// 处理响应中文乱码问题
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print(value);
}
}
form.html
通过Request对象传递数据
- 什么是域对象:在一定的范围内,可以存值和取值
- request域对象:在一次请求中,可以存值和取值
- 存值:setAttriute(String key,object obj);
- 取值:Object obj = getAttribute(String key);
- 移除:removeAttribute(String key);
RequestDispatcher对象的应用
RequestDispatcher接口
- 在开发中访问到一个web资源后,需要服务器跳转到另一个资源去处理请求,可以通过sendRedirect重定向方法来实现,也可以RequestDispatcher转发对象的forward方法来实现
- 得到转发对象:RequestDispatcher forwardObj = request.getRequestDispatcher(“另一个资源的路径”);
常用方法
- 实现请求转发:forwardObj.forward(request,response);
- 实现请求包含:forwardObj.include(request,response);
请求转发
请求转发原理图:
例:
RequestForwardServlet
package chapter.request;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class RequestForwardServlet
*/
public class RequestForwardServlet 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 {
// 1.获取转发对象,转发到resultservlet
RequestDispatcher rd = request.getRequestDispatcher("/result");
// 2.调用转发方法,实现转发效果
request.setAttribute("Company", "it----");
rd.forward(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
RequestResultServlet
package chapter.request;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class RequestResultServlet
*/
public class RequestResultServlet 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 {
// 处理响应中文的乱码问题
response.setContentType("text/html;charset=utf-8");
Object obj = request.getAttribute("Company");
String name = (String) obj;
response.getWriter().print("公司名称:" + name);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
注:请求转发:发送了一次请求,响应一次,和request域对象配合使用,可以实现值的传递。转发路径:转发动作是在服务器内部实现的,所以转发路径不用携带项目名称。
请求重定向:发送了两次请求,响应两次,不能喝request域对象配合使用。重定向路径:重定向动作实在浏览器端执行的,所以路径需要携带项目名称。
请求包含
请求包含原理图:
例:
RequestIncludingServlet
package chapter.request;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 这是一个包含的Servlet,需要去包含其他web资源
*/
public class RequestIncludingServlet 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 {
response.setContentType("text/heml;charset=utf-8");
// 1.获取转发对象
RequestDispatcher rd = request.getRequestDispatcher("/included?p=abc");
// 2.请求包含动作
PrintWriter out = response.getWriter();
out.print("including before----");
// 3.去包含includedServlet
rd.include(request, response);
out.print("including after-----");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
RequestIncludedServlet
package chapter.request;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 被包含的Servlet
*/
public class RequestIncludedServlet 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 {
// 1.获取输出字符流对象
PrintWriter out = response.getWriter();
// 2.输入一段中文
out.print("中国" + "<br/>");
out.print("request URI" + request.getRequestURI()+"<br/>");
// 3.获取请求路径后面拼接的参数
out.print("request URI after param" + request.getQueryString()+"<br/>");
// 4.获取请求的参数
out.print("getParameter" + request.getParameter("p")+"<br/>");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
注:请求包含:发送一次请求,请求包含是有服务器完成。请求包含路径:在服务器内部完成的,路径不需要携带项目名称。
转载:https://blog.csdn.net/DTRblank/article/details/105452338
查看评论