HttpServletRequest应用

HttpServletResquest知识:

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

获取请求消息头的内容:

获取请求消息头的所有名称:

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-Alive

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

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

获取所有参数名称:
Enumeration e=request.getParameterNames();

用beanutils封装获取到的参数:

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

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>
总结:当连接是给客户端使用的,需要写当前应用,给服务器使用的,不需要写,“/”就代表当前应用

转载于:https://my.oschina.net/u/1589656/blog/268269

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值