深入体验的JavaWeb开发内幕 - 关于HttpServletRequest对象
HttpServletRequest的对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的相关方法,即可以获得客户的这些信息。
一,通过请求常用方法获得相关信息:
如图1所示,通过请求常用方法获得客户机信息
- getRequestURL方法返回客户端发出请求时的完整URL。
- getRequestURI方法返回请求行中的资源名部分。
- getQueryString方法返回请求行中的参数部分。
- 的getRemoteAddr方法返回发出请求的客户机的IP地址
- getRemoteHost方法返回发出请求的客户机的完整主机名
- getRemotePort方法返回客户机所使用的网络端口号
- getLocalAddr方法返回WEB服务器的IP地址。
- 号·getLocalName方法返回WEB服务器的主机名
- getMethod得到客户机请求方式
例如在请求。的Java中加入如下代码:
即可获取相关信息。
2,通过请求常用方法获得客户机请求头信息
- getHead(名称)方法
- getHeaders(String name)方法
- getHeaderNames方法
如:
3.获得客户机请求参数(客户端提交的数据)
- 的getParameter(名称):获取指定名称的参数值这是最为常用的方法之一。
- getParameterValues(String name):获取指定名称参数的所有值数组。它适用于一个参数名对应多个值的情况。如页面表单中的复选框,多选列表提交的值。
- getParameterNames():返回一个包含请求消息中的所有参数名的枚举对象通过遍历这个枚举对象,就可以获取请求消息中所有的参数名
- getParameterMap():返回一个保存了请求消息中的所有参数名和值的地图对象.MAP对象的键是字符串类型的参数名,值是这个参数所对应的对象类型的值数组。
二,请求的常见应用
1,各种表单输入项数据的获取
如可以获取表单中的文本,密码,收音机,复选框,文件,选择,文本,隐藏,图像,按钮等组件的值进行数据库操作或其他处理操作。
来看一个具体应用:
界面代码主体部分如下:
然后,定义一个RequestLogin.java类通过请求对象获取表单中组件的值:
如调用自定义方法:
即可获取表单中组件的值。
2,请求参数的中文乱码问题
前面我们提到了响应对象中出现乱码问题及相应的解决措施,那么在申请中如何解决编码问题呢?
下面来看具体的例子:
例如我想将一个形成表单中的信息提取到并在控制台输出如图:
假设在服务端并未请求对象给指定编码时即服务器端接收请求的字符编码为ISO8859-1,这时你在客户端添加信息如:
当填入的信息有中文时,假设设置表单的提交方式为邮寄方式提交
则在服务端输出如下:
此时输出结果出现乱码。
客户端主体代码同上:
服务端主体代码如下:
这里会出现乱码问题,是因为你在RegisterLogin.java中并没有给请求对象设置编码集,而请求对象的默认编码集是ISO8859-1是不支持汉字的,所以你只需要在此类中为其指示相应的编码即可:
改正:在doGet方法中加入如下代码指明接收请求的编码方式:
request.setCharacterEncoding(“utf-8”);
即可输出:
但是这种修改方式只在提交方式为后时才有效。当提交方式为get时是不起作用的。
即;
<form action =“RequestLogin”method =“get”>
时即便在
RequestLogin.java
中再设置
request.setCharacterEncoding( “UTF-8”);
也不会起任何作用了程序还会输出如图所示信息:
RequestLogin.java
中含有中文English的地方进行如下设置了即在的doGet方法中加入如下代码:
此时再度测试时就OK了!如图
好了到这里,你大概已经知道该如何对响应和请求对象中的乱码问题进行操作了吧!
3,防盗链
所谓的防盗链就是当你以一个非正常渠道去访问某一个网站资源的时候,服务器会将你的请求忽略并且将你的当前请求变为按正常渠道访问时的请求并返回到相应的页面,用户只有通过该页面中的相关操作去访问想要请求的最终资源。
例如,你有一个访问某资源的网址,但是你事先不知道这个网址是有防盗链的,那么当你输入该网址时你可能会发现,并没有马上跳转到你想要的资源页面而是一些无关的信息页面,但是就是在这些信息页面中你发现有一个超链接或是其他操作可以跳转到你所访问的最终资源页面。
这就是防盗链技术了,好了来看一个具体应用:
Rquest.java
index.jsp的部分的主体代码:
效果如图:
例如我最终想要通过http:// lcoalhost:8080 /请求/请求这个网址获取到我想要的“东成西就”
的资源可当当我真正的输入这个网址时,却转到了:
http: /localhost:8080/Request/index.jsp这个页面
只有当你点击“喜剧片”这个超链接时才会真正的得到你想要的资源页面即:
好了赶快自己动手试一试吧!
4,请求对象实现请求转发:
servlet API中定义了一个RequestDispatcher接口,俗称请求分派器。它定义了如下两个方法:public void forward(ServletRequest request,ServletResponseresponse),public void include(ServletRequest request,ServletResponse response)
获取RequestDispatcher的实例的方式主要有两种:
- 调用ServletContext的接口提供的的getRequestDispatcher(Stringurl)方法。
- 调用的ServletRequest接口提供的的getRequestDispatcher(Stringurl)方法。
RequestDispatcher的:
被包含的的Servlet程序不能改变响应消息的状态码和响应头,如果它里面存在这样的语句,这些语句的执行结果将被忽略。
例:
的request.getRequestDispatcher( “./ Welcome.jsp中 ”)向前(请求,响应);即可从当前应用跳转到相应的“ ./Welcome.jsp” 页面。
请求对象提供了一个的getRequestDispatcher方法,该方法返回一个RequestDispatcher的对象,调用这个对象的前进方法可以实现请求转发。
请求对象同时也是一个域对象,开发人员通过请求对象在实现转发时,把数据通过请求对象带给其它网络资源处理。
可通过如下方法对请求中的数据对象进行操作:
- setAttribute方法;
- getAttribute方法
- 方法的removeAttribute;
- getAttributeNames方法;
三,关于请求转发的一些细节
- 转发方法用于将请求转发到RequestDispatcher的对象封装的资源。
- 如果在调用转发方法之前,在Servlet的程序中写入的部分内容已经被真正地传送到了客户端,向前方法将抛出IllegalStateException异常异常。
- 如果在调用前向方法之前向Servlet引擎的缓冲区(响应)中写入了内容,只要写入到缓冲区中的内容还没有被真正输出到客户端,forward方法就可以被正常执行,原来写入到输出缓冲区中的内容将被清空,但是,已写入到HttpServletResponse对象中的响应头字段信息保持有效。
四,请求重定向和请求转发的区别
一个网络资源收到客户端请求后,通知服务器去调用另外一个网络资源进行处理,称之为请求转发。
一个网络资源收到客户端请求后,通知浏览器去访问另外一个网页资源,称之为请求重定向。
注意:
- RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的组件;而HttpServletResponse.sendRedirect方法还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。如果传递HttpServletResponse.sendRedirect方法的相对URL以“/”开头,它是相对于整个WEB站点的根目录;如果创建RequestDispatcher对象时指定的相对URL以“/”开头,它是相对于当前的WEB应用程序的根目录。
- 调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;调用RequestDispatcher.forward方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。
- HttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另一个URL的访问请求; RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。
- RequestDispatcher.forward方法的调用者与被调用者之间共享相同的请求对象和响应对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的请求对象和响应对象,它们属于两个独立的访问请求和响应过程。
关于请求消息头我们在以后的学习中还会经常用到请求对象是我们目前在的JavaWeb开发中学到的三个作用域即ServletContext中,请求和会话域之一,是非常重要的一个请求对象,希望以上的相关介绍对能你有所帮助!