JavaWeb核心---Request

HttpServletRequest

HttpServletRequest概述

我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。

service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加强大

HttpServletRequest对象代表服务器的响应,该对象封装了获得Http请求的请求行,请求头和请求体的方法

Request的运行流程


request获得请求行

获得的请求方式:String getMethod()
获得请求的资源:
String getRequestURI() 
StringBuffer getRequestURL() 
String getContextPath()   获得web应用的名称
String getQueryString()   get提交url地址后的参数字符串

request.getRemoteAddr()   获得访问的客户端IP地址

代码演示:


request获得请求头

String getHeader(String name)
long getDateHeader(String name)
Enumeration getHeaderNames()
Enumeration getHeaders(String name)
int getIntHeader(String name)

代码演示:

附:referer头的作用:获取此访问的的来源,可做防盗链 .eg :


request获得请求体

String getParameter(String name) 
String[] getParameterValues(String name)
Enumeration getParameterNames()

Map<String,String[]> getParameterMap()

PS:该方法获得的集合Map第二个的泛型是String[]数组,原因是一些多项选择的表单提交...(其他看名字就知道是干什么的了,不再多说)

获取中文参数乱码问题

乱码的过程:参数在客户端浏览器用UTF-8编码,而当在执行获取String parameter=request.getParameter(name)时是默认用ISO-8859-1解码造成

解决post提交的方式的乱码:

request.setCharacterEncoding("UTF-8");(该方法get提交的方式不可用)

即设置用UTF-8解码即可

解决get提交的方式的乱码:

既然上面方法不可用,我们可以尝试换一个思维,逆思维

即将得到的乱码,如上文得到的parameter乱码字符串,利用ISO-8859-1编码,再用UTF-8解码即可得到中文参数值

eg : parameter=new String(parameter.getbytes("ISO8859-1-1"),"UTF-8");

PS : 其实一般的表单提交都是用post提交方式,所以解决乱码问题一般用request.setCharacterEncoding("UTF-8")方法即可

代码演示:


request的其他功能

1. request是一个域对象

request域对象保存时间只在一次请求中,也就是说,一次请求完毕后,request域对象就销毁了,一旦request对象销毁,那么存在其中的数据也就不存在了

那么为什么需要域对象呢

有时我们的业务,在一个Servlet完成不了,需要另一个Servlet帮忙,这就是说,我们需要在二个或者多个Servlet之间传递数据,域对象就负责完成这下项任务

同样,request域对象也有其下方法

setAttribute(String name, Object o)
getAttribute(String name)

removeAttribute(String name)
PS : request域的作用范围:一次请求中

2. request完成请求转发

有些时候,一个Servlet不能很好的完成业务工作,需要另一个Servlet来配合。这就是说,很有可能一个Servlet需要将流程交由另一个Servlet,此时就要用转发或重定向这二个技术,而这里我们之说request转发。

转发必用用的方法

获得请求转发器----path是转发的地址
RequestDispatcher rd=requuest. getRequestDispatcher(String path)
通过转发器对象转发
rd.forward(ServletRequest request, ServletResponse response)

转发是服务器内部的事,与浏览器无关,所以浏览器的地址栏不会变, 
原来浏览器以什么方式提交数据,转发到另一个Servlet依然执行对应的 

doXxx方法。

PS :转发不限于Servlet之间,Servlet也可以转发到HTML或JSP页面


实例:用户注册和登录错误信息的回显

封装User类


RegisterServlet


LoginServlet


users表


PS:还有其他一些.jsp等文件就不展示了


猜你喜欢

转载自blog.csdn.net/PNGYUL/article/details/80009503
今日推荐