一:Request常用方法
1.1:获取客服机信息
getQueryString():返回请求参数部分 —— 如:请求的URL地址中附带的参数:name=lx&sex=girl
getRequestUrl():返回客服端发出请求的完整URL—— 如:请求的URL地址http://localhost:8080/RequestDemo01
getRemoteAddr方法返回发出请求的客户机的IP地址 —— 如:来访者的IP地址:0:0:0:0:0:0:0:1
1.2:返回响应头信息
Enumeration<String> headerEnum= request.getHeaderNames(); // 返回所有请求的响应头名称
String headerValue= request.getHeader(String headerName); // 返回响应头名称对应的响应头值
Enumeration<String> e= request.getHeaders(String headerName);//返回响应头名称对应的响应值
1.3:获取客服端请求参数
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
request.setCharacterEncoding("utf-8"); //设置服务端已utf-8编码方式接收前端参数
response.setCharacterEncoding("utf-8"); //设置服务端发送给客户端的编码方式为utf-8
response.setContentType("text/html;charset=UTF-8"); //设置客服端接收数据的编码方式为utf-8
response.getWriter().write("<font color='red'>getParameter获取编码(单选框)的值:</font>"+request.getParameter("userid"));
response.getWriter().write("<br/>");
response.getWriter().write("<font color='red'>getParameter获取 兴趣(复选框)的值:</font>");
for(String s: request.getParameterValues("inst")){
response.getWriter().write(s+",");
}
response.getWriter().write("<br/>");
response.getWriter().write("<font color='red' >getParameterMap获取form表单所有值</font>");
response.getWriter().write("<br/>");
Map<String, String[]> parameterMap = request.getParameterMap();
for(java.util.Map.Entry<String, String[]> entry : parameterMap.entrySet()){
String name=entry.getKey();
String value="";
String[] valueArr=entry.getValue();
for(int i=0 ;valueArr!=null && i<valueArr.length; i++ ){
if(i==valueArr.length-1){
value+=valueArr[i];
}else{
value+=valueArr[i]+",";
}
}
response.getWriter().println(MessageFormat.format("{0}={1}", name,value));
response.getWriter().write("<br/>");
}
}
二:request接收表单提交中文参数乱码问题
2.1:用POST提交方式提交中文
POST方式向服务器提交中文内容的时候,由于客服端的编码方式与服务器编码方式不同导致获取的参数值出现乱码问题,我的客服端的编码方式为utf-8,服务端的编码方式为ISO8859-1。所以此处为了防止中文乱码,我需要把我的服务端编码方式改为与客服端一致。
2.2:用GET提交方式提交中文
猜想与POST方式一致,只要通过request.setCharacterEncoding(“客服端编码”)这种方式,就能防止中文乱码
猜想错误,即使设置了服务器的编码方式,仍然会出现乱码的现象。这里我暂且理解为,request.setCharacterEncoding这种设置服务器编码方式的方法不能适用于get提交。于是采用另一种方式来防止中文乱码,把当前request接收的参数值用服务器默认的编码方式进行编码生成字节数组,再把生成的字节数组采用客服端的编码方式解码
注意:a标签超链接的方式采用get方式提交,服务端防止乱码的方式与get提交相同。另外,需要提的一点就是URL地址后面如果跟了中文数据,那么中文参数最好使用URL编码进行处理,如下所示:
<a href="${pageContext.request.contextPath}/servlet/RequestDemo05?userName=gacl&name=<%=URLEncoder.encode("小明", "UTF-8")%>">点击</a>
三:request请求转发
3.1:request请求转发实现方式
ServletConfig servletConfig = this.getServletConfig();
servletConfig.getServletContext().getRequestDispatcher("/form.jsp").forward(request, response);
3.2:request请求转发与response重定向的区别
/**
* 通过请求转发跳转到index.jsp
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
private void dispatcherTOIndex(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
/**
* 重定向与请求转发有什么区别:
* 1:请求转发可以向下封装request与response对象
* 2:请求转发是服务器内部跳转,浏览器的URL不会改变;重定向是服务端通知浏览器去访问另一个URL,浏览器的URL会发生改变
* 3:请求转发的Path只能是当前项目的Path,重定向Path可以是项目以外的path
* 4:请求转发的响应状态为307;重定向的响应状态为302
*/
ServletConfig servletConfig = this.getServletConfig();
servletConfig.getServletContext().getRequestDispatcher("/form.jsp").forward(request, response);
}
/**
* 通过重定向跳转到index.jsp
* @param response
* @throws IOException
*/
private void redirectToIndex(HttpServletResponse response) throws IOException{
//通过设置响应状态为302,响应头为Location实现重定向
//response.setHeader("Location", "/index.jsp");
//response.setStatus(HttpServletResponse.SC_FOUND);
//直接调用sendRedirect实现response重定向(sendRedirect的内部就是通过设置响应状态为302,响应头为location实现)
response.sendRedirect("/form.jsp");
}
2018-09-13:补充request接收json封装的参数
比如参数格式为:
{
“username”:”lx”,
“password”:”123456”
}
private Map<String, Object[]> requestParamToMap(HttpServletRequest request) throws IOException {
// TODO Auto-generated method stub
ServletInputStream inputStream = request.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
StringBuffer sb=new StringBuffer();
String line="";
while((line=br.readLine())!=null){
sb.append(line);
}
JSONObject jo=JSONObject.fromObject(sb.toString());
//如果传递多选框传递的参数,那么需要把这些参数封装为数组比如:{"username":"lx","password":"123456","password":"abcdedf"}
Map<String,Object[]> paramMap=new HashMap<String,Object[]>();
if(jo!=null){
Map<String,?> map=jo;
for(String key :map.keySet()){
Object object = map.get(key);
Object[] objArr=new Object[]{object};
if(object instanceof JSONArray){
JSONArray ja=(JSONArray)object;
objArr = ja.toArray();
}
paramMap.put(key, objArr);
}
}
return paramMap;
}