Servlet中Request用法和API
1.Request概述
--用户通过浏览器访问服务器时,Tomcat将HTTP请求中所有的信息都封装在Request对象中
--作用:开发人员可以通过request对象方法,来获取浏览器发送的所有信息.
2.Request体系结构
ServletRequest | HttpServletRequest | org.apache.catalina.connector.RequestFacade(由tomcat厂商提供)
3.Request获取Http请求信息
String getMethod() 获取请求方式 GET String getContextPath() 获取项目网络地址(虚拟路径) String getRequestURI() 统一资源标识符(范围广) StringBuffer getRequestURL() 获取URL(统一资源定位符) String getProtocol() 获取协议和版本号 HTTP/1.1 String getRemoteAddr() 获取客户端ip地址 getLocalAddr() 获取用户ip地址
解决post提交方式的乱码:request.setCharacterEncoding("UTF-8");
解决get提交的方式的乱码:parameter = new String(parameter.getbytes("iso8859-1"),"utf-8");
String getHeader(String name) 根据请求头的名称获取对应的值,注意:不区分大小写 Enumeration<String> getHeaderNames() 获取所有请求头的名称--注意:Iterator前身迭代器
req.setCharacterEncoding("utf-8"); System.out.println("请求方式=" + req.getMethod()); System.out.println("项目名=" + req.getContextPath()); System.out.println("当前访问相对目录=" + req.getRequestURI()); System.out.println("当前访问绝对路径=" + req.getRequestURL()); System.out.println("http版本号=" + req.getProtocol()); System.out.println("获取用户ip地址=" + req.getLocalAddr()); System.out.println("获取ip地址=" + req.getRemoteAddr()); // System.out.println("两个绝对路径="); System.out.println(this.getServletContext().getRealPath("/")); System.out.println(req.getSession().getServletContext().getRealPath("/")); String path = req.getContextPath(); String basePath = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + path + "/"; System.out.println("拼接获取服务器加模块名=" + basePath); //获取请求头 String header = req.getHeader("Host"); System.out.println(header); Enumeration<String> headerNames = req.getHeaderNames(); while (headerNames.hasMoreElements()) { String sname = headerNames.nextElement(); String header1 = req.getHeader(sname); System.out.print(sname + "::" + header1); }
结果 (省略一堆header值)
请求方式=GET 项目名=/web08_servlet_anno 当前访问相对目录=/web08_servlet_anno/indexServlet 当前访问绝对路径=http://localhost:8080/web08_servlet_anno/indexServlet http版本号=HTTP/1.1 获取用户ip地址=0:0:0:0:0:0:0:1 获取ip地址=0:0:0:0:0:0:0:1 两个绝对路径= G:\ouClass\artifacts\web08_servlet_anno_war_exploded\ G:\ouClass\artifacts\web08_servlet_anno_war_exploded\ 拼接获取服务器加模块名=http://localhost:8080/web08_servlet_anno/ localhost:8080
//header....
注意:在jsp中获取静态路径使用的是
req.getContextPath()
对应jsp
${pageContext.request.contextPath}或<%=request.getContextPath()%>
详情查看 https://www.cnblogs.com/xiaozhang666/p/13355474.html
4.获取请求参数
--不论get还是post请求方式,都可以使用下列方法来获取请求参数
--在web阶段,get和post方法处理的业务逻辑是一样的...
--根据参数名获取参数值
String getParameter(String name) --根据参数名获取参数值数组 例如 hobby=somke&hobby=drink String[] getParameterValues(String name) --获取所有的参数名和参数值,封装map集合(key参数名,value参数值) Map<String,String[]> getParameterMap()
--前端传值为数组时
String[] likeList = request.getParameterValues("likearr[]");
--get:在tomcat8及以上版本,内部url编码(UTF-8)
post:编码和解码格式不统一,产生乱码...
浏览器 编码:UTF-8
服务器默认 解码:ISO-8859-1 西欧(拉丁文)
指定服务器解码方式
void setCharacterEncoding(String env)
注意:这哥们必须在post方法的行首
//中文乱码 request.setCharacterEncoding("utf-8"); //获取参数 String name = request.getParameter("name"); String pwd = request.getParameter("pwd"); String[] likes = request.getParameterValues("like"); String[] likeList = request.getParameterValues("likearr[]");
5.请求转发
* API 1.通过reuqest对象获取转发器对象 RequestDispatcher getRequestDispatcher(String path) 2.通过转发器对象,实现请求转发 void forward(ServletRequest request, ServletResponse response) * 请求转发特点 浏览器地址栏没有发生改变 浏览器只发送了一次请求(request、response只创建一次,多个转发的servlet共享) 只能转发服务器内部资源 * 链式编程 request.getRequestDispatcher("/BServlet").forward(request, response);
6.域对象(共享数据)
--域对象:一个有作用范围的对象,可以在范围内共享数据
--request域:代表一次请求的范围,一般用于一次请求中转发的多个资源中共享数据
* API 1.存数据 void setAttribute(String name,Object o); 2.取数据 Object getAttribute(String name); 3.删数据 void removeAttribute(String name); * 生命周期 1.创建? 用户发送请求时,创建request 2.销毁? 服务器做出响应,销毁request 3.范围? 一次请求,多次转发
7.获取ServletContext对象
public ServletContext getServletContext();
此对象为Servlet上下文对象,只会创建一个
补充案例和api
视频防盗链
/* 视频播放源,判断... */ @WebServlet("/RefererRequest") public class RefererRequest extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=utf-8"); // 1.获取请求来源信息(注意:如果浏览器直接访问,这个头返回的值为null) String referer = req.getHeader("referer"); // 2.判断是否为家族体系访问源 if (referer != null && referer.startsWith("http://localhost:8080/web09_request")) { resp.getWriter().write("<h3>正常播放视频...</h3>"); } else { resp.getWriter().write("<h3>想看吗?来腾讯把...</h3>"); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }
浏览器兼容性
user-agent:获取浏览器版本信息
/* 浏览器兼容性 */ @WebServlet("/UserAgentRequest") public class UserAgentRequest extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=utf-8"); // 1.获取浏览器信息 String userAgent = req.getHeader("user-agent"); // 2.判断 if (userAgent.contains("Chrome")) { resp.getWriter().write("谷歌体系浏览器"); } else if (userAgent.contains("Firefox")) { resp.getWriter().write("火狐体系浏览器"); } else { resp.getWriter().write("其他体系浏览器"); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }
request.getServletPath() 获取客户端请求的路径名如:/object/delObject request.getServerName() 获取服务器地址,如:localhost request.getServerPort() 获取服务器端口,如8080 request.getLocalName() 获取本地IP映射名,如:localhost request.getLocalPort() 获取本地端口,如:8090 request.getRealPath("/") 获取项目所在服务器的全路径,如:D:\Program Files\apache-tomcat-7.0.25\webapps\TestSytem\ request.getRemoteAddr() 获取远程主机地址,如:127.0.0.1 request.getRemoteHost() 获取远程主机,如:127.0.0.1 request.getRemotePort() 获取远程客户端端口,如:3623 request.getRequestedSessionId() 获取会话session的ID,如:823A6BACAC64FB114235CBFE85A46CAA request.getRequestURI() 获取包含项目名称的请求路径,如:/TestSytem/object/delObject request.getRequestURL().toString() 获取请求的全路径,如:http://localhost:8090/TestSytem/object/delObject