JAVA基础之HttpServletRequest请求
httpservletrequest请求是获取请求行、请求头和请求体;可以通过这个方法设置防盗链,获取地址。牢记解决乱码的方式。
怎么选择是重定向还是转发呢?通常情况下转发更快,而且能保持request内的对象,所以他是第一选择。但是由于在转发之后,浏览器中url仍然指向开始页面,此时如果重载当前页面,开始页面将会被重新调用。如果你不想看到这样的情况,则选择转发。详见https://www.cnblogs.com/wenanbang/p/4142415.html
一、httpservletrequest:
概述和运行流程详见httpservletresponse!
二、获取http请求:
三、获取请求行:
1、获得客户端的请求方式:
getmethod() 获得string类型;
2、获得请求的资源:
getcontextpath() 获得string类型的 web应用的名称(项目名)
getquerystring() 获得 get提交url 地址后的参数字符串;
getrequesturi() 获取uri地址string类型
getrequesturl() 获取url地址stringbuffer类型
request.getremoteaddr() 获得访问的客户端ip地址
protected void doget(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { // 获取请求方式 string method = request.getmethod(); system.out.println("请求方式为:" + method); // 获取请求uri string uri = request.getrequesturi(); system.out.println("uri为" + uri); // 获取请求url stringbuffer url = request.getrequesturl(); system.out.println("url为:" + url); // uri为/web/lineservlet // url为:http://localhost:8080/web/lineservlet // 获取web项目名称 string name = request.getcontextpath(); system.out.println("web项目名称为:" + name); // 获取get请求后url后的字符串 string query = request.getquerystring(); system.out.println("get请求的参数为:" + query); // 获取客户端的ip地址 string ip = request.getremoteaddr(); system.out.println("ip地址为:" + ip); }
四、获取请求头:
getheader(string name)
referer 头的作用:获取该访问的来源,做防盗链
protected void doget(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { // 获取refere头 string refere = request.getheader("referer"); string content = null; if(refere.startswith("http://localhost:8080")){ content="真的离婚了!"; }else{ content="你是小偷!"; } //解决乱码 response.setcontenttype("text/html;charset=utf-8"); response.getwriter().write(content); }
<%@ page language="java" contenttype="text/html; charset=utf-8" pageencoding="utf-8"%> <!doctype html public "-//w3c//dtd html 4.01 transitional//en" "http://www.w3.org/tr/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>insert title here</title> </head> <body> <a href="/web/refereservlet">宋仲基和宋慧乔分手了</a> </body> </html>
五、获得请求体:
1、解决post提交方式的乱码:request.setcharacterencoding("utf-8");
2、解决get提交的方式的乱码:
parameter = new string(parameter.getbytes("iso8859-1"),"utf-8");
protected void doget(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { //解决中文乱码问题(post请求) // request.setcharacterencoding("utf-8"); //获取请求参数 //1.单个值的参数 string name=request.getparameter("username"); //get解决乱码:得先将获取到的信息用原来的编码表进行解码,然后再用后来的编码表进行编码 name=new string(name.getbytes("iso-8859-1"),"utf=8"); string sex=request.getparameter("sex"); system.out.println(name+" ......"+sex); //2.获取多个值的 string[] hobbys=request.getparametervalues("hobby"); //遍历 for(string s:hobbys){ system.out.println(s); } //3.获取所有的请求参数map map<string,string[]> map=request.getparametermap(); //遍历 set<string> set=map.keyset(); for(string str:set){ string [] value=map.get(str); for(string v:value){ system.out.println(str+"..."+v); } }
六、request的其他功能:
1、request 也是个域对象,也是具有以下功能:
setattribute(
string name,
object o)
getattribute(
string name)
removeattribute(
string name)
2、request完成请求转发:
获得请求转发器----path
是转发的地址
requestdispatcher
getrequestdispatcher(
string path)
通过转发器对象转发
requestdispathcer.forward(
servletrequest request,
servletresponse response)
七、servletcontext
域与
request
域的生命周期比较
:
1、servletcontext
:
创建:服务器启动
销毁:服务器关闭
域的作用范围:整个
web
应用
2、request
:
创建:访问时创建
request
销毁:响应结束
request
销毁
域的作用范围:一次请求中
八、转发和重定向的区别:
1、
重定向两次请求,转发一次请求
2、
重定向地址栏的地址变化,转发地址不变
3、
重新定向可以访问外部网站
转发只能访问内部资源
4、
转发的性能要优于重定向
(需要带数据的时候用请求转发,由第一个
servlet01
带数据到
servlet02
!
需要地址转变的用重定向)
public class servlet01 extends httpservlet { protected void doget(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { //向request域中存值 request.setattribute("name", "张三" ); //请求转发 request.getrequestdispatcher("/servlet02").forward(request, response); }
public class servlet02 extends httpservlet { public void doget(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { //从request 域中取值 string name =(string)request.getattribute("name"); //解决中文乱码 response.setcontenttype("text/html;charset=utf-8"); response.getwriter().write("hello"+name); }
上一篇: 6、多线程之单例模式