HttpServletRequest应用

HttpServletResquest知识:html

Request的主要方法:
request.getRequestURL().toString();//获取URL地址:URL:协议,主机,资源地址
request.getRequestURI();//获取资源地址
request.getQueryString();//获取地址后所跟的参数
request.getRemoteAddr();//获取来访者的ip地址
request.getRemotePort();//获取来访者端口
request.getMethod();//获取来访者的请求方式
request.getProtocol();//客户端的请求方式浏览器

获取请求消息头的内容:服务器

获取请求消息头的全部名称:app

Enumeration<String> e=request.getHeaderNames();
while(e.hasMoreElements()){
 String str=e.nextElement();
 System.out.println(str+":"+request.getHeader(str));
}
请求消息头:
accept:text/html, application/xhtml+xml, */*
accept-language:zh-CN
user-agent:Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
accept-encoding:gzip, deflate
host:localhost:8080
dnt:1
connection:Keep-Aliveide

获取客户端提交的参数(正文):
获取参数:
String str=request.getParameter("username");post

当有两个相同name的参数时,用:
String []str=request.getParameterValues("password");
获取便可。this

获取全部参数名称:
Enumeration e=request.getParameterNames();spa

用beanutils封装获取到的参数:code

User us=new User();
BeanUtils.populate(us, request.getParameterMap());
System.out.println(us);orm

User为一个描述类,描述要封装的数据,
public class User {
 private String username;         //命名要与表单中的name中的命名相同
 private int psw;
 private String code;
 public String getUesername() {
  return username;
 }
 public void setUesername(String uesername) {
  this.username = uesername;
 }
 public int getPsw() {
  return psw;
 }
 public void setPsw(int psw) {
  this.psw = psw;
 }
 public String getCode() {
  return code;
 }
 public void setCode(String code) {
  this.code = code;
 }
 @Override
 public String toString() {
  return "User [uesername=" + username + ", psw=" + psw + ", code="
    + code + "]";
 }
}


表单输入域的特色:
用beanutils封装表单中的资源时,有一点要注意:
封装前,描述类中的属性值都为null,
封装后,若是没有上传字段的属性,显示的是什么都没有,而不是null,
若是没有该字段,则显示的为null;
表单中的单选框和多选框若是没有选择,则根本不会向服务器传值,也显示的为null。


请求参数是中文:
知识点:浏览器当前是什么码表,就以什么码表向服务器传输
服务器以iso-8859-1 来解码

处理:post请求:response.setCharacterEncoding("UTF-8");
 get请求:new String(name.getBytes("iso-8859-1"),"UTF-8");//name为:resquest.getparameter("name");
 get请求方式没法用beanutils来封装,只能单个封装,因此推荐post请求。


请求重对象和请求转发:

请求重对象:二次请求,浏览器的行为,地址栏会发生变化。
请求转发:一次请求,服务器行为,地址栏不会发生变化

请求重对象:
方式一:
public class TextRequest2 extends HttpServlet {

 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
   //告知浏览器没法处理请求
  response.setStatus(302);
  response.setHeader("location", "/TextRequest/servlet/TextRequest3");
 }

方式二:(推荐)
response.sendRedirect("/TextRequest/servlet/TextRequest3");

TextRequest2为请求重对象:源;TestRequest3为请求重对象目标

请求转发:
请求源:request.setAttribute("p", "ppp");
  //请求转发方式一:用servletcontext转发
  ServletContext sc=getServletContext();
  RequestDispatcher rd=sc.getRequestDispatcher("/servlet/TextRequest3");
  rd.forward(request, response);
  用这种方式转发,路径必须以“/”开头,表明绝对路径,当前应用

请求目标:String str=(String)request.getAttribute("p");
  //请求转发方式二:
  RequestDispatcher rd=request.getRequestDispatcher("TextRequest3");
  rd.forward(request, response);
  这种方式转发,能够以“/”开头,表示绝对路径,也能够不以“/”开头,表明相对路径,


当不须要在目标对象中取得源中的对象时,使用请求重对象,不然使用请求转发。

包含:
源对象代码:
response.setCharacterEncoding("UTF-8");
response.getWriter().write("哈哈");
RequestDispatcher rd=request.getRequestDispatcher("/servlet/TextRequest");
rd.include(request, response);


目标对象代码:
response.setCharacterEncoding("UTF-8");
response.getWriter().write("哈哈");

URL的书写方式:相对路径(不推荐)绝对路径:重对象:response.sendRedirect("/TextRequest/servlet/TextRequest3")转发:request.getRequestDispatcher("/servlet/TextRequest");超连接:<a href="/TextRequest/servlet/TextRequest3"/>表单:<form action="/TextRequest/servlet/TextRequest3"></form>总结:当链接是给客户端使用的,须要写当前应用,给服务器使用的,不须要写,“/”就表明当前应用

相关文章
相关标签/搜索