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等文件就不展示了