Servlet第三天Request
1.HttpServletRequest
1.获取客户机信息:
•getRequestURL方法返回客户端发出请求时的完整URL。
•getRequestURI方法返回请求行中的资源名部分。
•getQueryString 方法返回请求行中的参数部分。
•getRemoteAddr方法返回发出请求的客户机的IP地址
•getRemoteHost方法返回发出请求的客户机的完整主机名
•getRemotePort方法返回客户机所使用的网络端口号
•getLocalAddr方法返回WEB服务器的IP地址。
•getLocalName方法返回WEB服务器的主机名
//获取请求信息 public class RequestTest extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取请求方式 System.out.println(request.getMethod()); // 获取请求URI System.out.println(request.getRequestURI());// /day06/RequestTest // 获取URL System.out.println(request.getRequestURL());// http://localhost/day06/RequestTest // 获取web应用名 System.out.println(request.getContextPath());// /day06 // 获取访问者IP System.out.println(request.getRemoteAddr()); // 访问主机 System.out.println(request.getRemotePort()); // 获取端口号 System.out.println(request.getRemotePort()); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
2.获取客户机请求头
•getHeader(string name)方法
•getHeaders(String name)方法
•getHeaderNames方法 获得所有的头的key
public class RequestTest2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { test_1(request); } // 获取头相关方法 private void test_1(HttpServletRequest request) { String headValue = request.getHeader("Accept-Encoding"); System.out.println(headValue); System.out.println("-------分隔符----------"); Enumeration<String> e = request.getHeaders("Accept-Encoding"); while (e.hasMoreElements()) { System.out.println(e.nextElement()); } System.out.println("-------分隔符----------"); // 获取所有头的名字 e = request.getHeaderNames(); while (e.hasMoreElements()) { String name = e.nextElement(); String value = request.getHeader(name); System.out.println(name + "=" + value); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
3.获得客户机请求参数(客户端提交的数据)
•getParameter方法
•getParameterValues(String name)方法
•getParameterNames方法 内省 BeanUtils
•getParameterMap方法
上传文件使用流获取数据在后面将会学习到
注意使用BeanUtils需要导入commons-beanutils-1.8.jar和commons.logging-1.1.1.jar两个包
/** * 获取提交数据 获取数据时,要先检查再再使用 * * @author malinkang * */ public class RequestTest3 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取数据方式1:根据名字获取值 String value = request.getParameter("username"); // 判断是否为空或空格 if (value != null && !value.trim().equals("")) { response.getWriter().write(value + "<br/>"); } // 获取数据方式2: Enumeration<String> e = request.getParameterNames(); while (e.hasMoreElements()) { String name = e.nextElement(); String value_2 = request.getParameter(name); response.getWriter().write(value_2 + "<br/>"); } // 获取数据方式3: // 当有多个username使用getParameterValues方法 String[] values = request.getParameterValues("username"); // 获取数据时,要先检查再再使用 for (int i = 0; values != null && i < values.length; i++) { response.getWriter().write(values[i] + "<br/>"); } // 获取数据方式4: Map<String, String[]> map = request.getParameterMap(); User user = new User(); try { // 用map数据填充Bean BeanUtils.populate(user, map); } catch (Exception e1) { e1.printStackTrace(); } System.out.println(user); // User [password=dasfas, username=[asdf, sadfasd]] } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
JavaBean
public class User { private String[] username; private String password; public String[] getUsername() { return username; } public void setUsername(String[] username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User [password=" + password + ", username=" + Arrays.toString(username) + "]"; } }
获取数据中文乱码解决方案:
提交数据两种方式1.Post方式提交(表单提交):设置字符编码
2.Get方式提交(超链接提交):不能采用设置字符编码来解决;可通过以下方式解决:1.将获取数据先编码再解码;2.修改服务器配置(不建议)3.通过URLEncoding编码解决
<a href="/.../Servlet?username<%=URLEncoder.encode("李四","UTF-8")%">提交</a>
/** * 中文乱码问题 * * @author malinkang * */ public class RequestTest6 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); // Get解决方案1 // System.out.println(new String(username.getBytes("iso8859-1"), // "utf-8")); // 解决方案2使用URLEncoder.encode进行编码 System.out.println(URLEncoder.encode(username, "utf-8")); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // post提交可以通过设置字符编码解决 request.setCharacterEncoding("UTF-8"); String username = request.getParameter("username"); System.out.println(username); } }
4.请求转发
Request对象实现请求转发:一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理。
request对象提供了一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发。
request对象同时也是一个域对象,开发人员通过request对象在实现转发时,把数据通过request对象带给其它web资源处理。
setAttribute方法 设置或添加数据
getAttribute方法 获取数据
removeAttribute方法 删除数据
getAttributeNames方法 获取名称,用于迭代
/** * 请求转发 * * @author malinkang mvc (modle (javabean) view(jsp) cotroller(Servlet)) */ public class ServletTest6 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String data = "hello"; request.setAttribute("hello", data); RequestDispatcher dispatcher = request .getRequestDispatcher("/index.jsp"); PrintWriter out = response.getWriter(); out.write(data); dispatcher.forward(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
请求转发的一些细节:
- 如果在调用forward方法之前,在Servlet程序中写入的部分内容已经被真正地传送到客户端,forward方法将抛出异常
- 如果在调用forward方法之前向Servlet引擎的缓冲区中写入了内容,只要写入到缓冲区中的内容还没有被真正输出到客户端,forward方法就可以被正常执行。原来写入到输出缓冲区的内容将被清空,但是,已经写入的响应头字段信息保持有效。
5.请求包含
6.防盗链
/** * 防盗链 * * @author malinkang * */ public class RequestTest7 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取头 String referer = request.getHeader("referer"); if (referer == null || referer.startsWith("http://localhost")) { // 跳转到首页 response.sendRedirect("/day06/index.jsp"); return; } response.getWriter().write("hello"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }