servlet web之httpservletrequest
阿新 • • 發佈:2018-11-05
目錄
request的常用方法
package cn.cast.request; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //request的常用方法 可以用來控制訪問許可權 ,根據使用者訪問資源的位置來控制 或者用來統計客戶訪問資源的次數 public class RequestDemo1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println(request.getRequestURI()); ///web1/servlet/RequestDemo1 System.out.println(request.getRequestURL()); //http://localhost:8080/web1/servlet/RequestDemo1 //獲取客戶機請求的查詢字串 //http://localhost:8080/web1/servlet/RequestDemo1?name=xxx //獲得 name=xxx System.out.println(request.getQueryString()); //獲取客戶機ip System.out.println(request.getRemoteAddr()); System.out.println(request.getRemoteHost()); //獲取來訪者埠號 System.out.println(request.getRemotePort()); //獲取請求方法 System.out.println(request.getMethod()); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
控制檯:
/web1/servlet/RequestDemo1
http://localhost:8080/web1/servlet/RequestDemo1
name=xxx
127.0.0.1
127.0.0.1
24153
GET
request獲取請求頭和請求資料
html
<!DOCTYPE html> <html> <head> <title>test.html</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <!--<link rel="stylesheet" type="text/css" href="./styles.css">--> </head> <body> <a href="/web1/servlet/RequestDemo2?username=xxx">aaaa </a> <form action="/web1/servlet/RequestDemo2" method="post"> 使用者名稱<input type="text" name="username"><hr> 密碼<input type="password" name="passwd"><hr> <input type="submit" value="提交"> </form> </body> </html>
package cn.cast.request; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.lang.reflect.InvocationTargetException; import java.util.Enumeration; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.beanutils.BeanUtils; import cn.cast.User; //獲取請求頭和請求資料 //獲取請求資料的時候一般來說都要先檢查再使用 public class RequestDemo2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //獲取資料方式1 String u1 = request.getParameter("username"); if (u1!=null && u1.trim().equals(null)){ System.out.println(u1); } //獲取資料方式2 Enumeration e= request.getParameterNames(); while (e.hasMoreElements()){ String name = (String) e.nextElement(); String value = request.getParameter(name); System.out.println(name+ "=" + value); } //獲取資料方式3 //獲取一個欄位的多個值 String value[] = request.getParameterValues("username"); for (int i=0 ;value != null && i<value.length;i++){ System.out.println(value[i]); } //獲取資料方式4 //將map集合封裝到物件 commons-beanutils-1.8.0.jarcommons-logging-1.0.4.jar Map map = request.getParameterMap(); //Map<String, String[]> map = request.getParameterMap(); User user = new User(); try { BeanUtils.populate(user, map); //用map集合中的資料填充bean } catch (IllegalAccessException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (InvocationTargetException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } System.out.println(user); //獲取資料方式5 InputStream in = request.getInputStream(); int len=0; byte buffer[] = new byte[1024]; while((len = in.read(buffer))>0){ System.out.println(new String(buffer,0,len)); } } private void test1(HttpServletRequest request) { String ae = request.getHeader("Accept-Encoding"); System.out.println(ae); //gzip, deflate //假設請求頭包含多個值 Enumeration em = request.getHeaders("Accept-Encoding"); while(em.hasMoreElements()){ String value = (String) em.nextElement(); System.out.println(value); } //得到所有請求頭的名稱 Enumeration e = request.getHeaderNames(); while (e.hasMoreElements()){ String key = (String) e.nextElement(); String value = request.getHeader(key); System.out.println(key + ":" + value); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
訪問:http://localhost:8080/web1/test.html
獲取使用者資料
html表單
<!DOCTYPE html>
<html>
<head>
<title>test.html</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
</head>
<body>
<a href="/web1/servlet/RequestDemo3?username=mm">aaaa </a>
<form action="/web1/servlet/RequestDemo3" method="post">
使用者名稱:<input type="text" name="username"><hr>
密碼:<input type="password" name="passwd"><hr>
性別:
<input type="radio" name="gender" value="male">男
<input type="radio" name="gender" value="femal">女<hr>
所在地:
<select name="city">
<option value="beijing">北京</option>
<option value="shanghai">上海</option>
<option value="changsha">長沙</option>
</select>
愛好:
<input type="checkbox" name="likes" value="sing">唱歌
<input type="checkbox" name="likes" value="dance">跳舞
<input type="checkbox" name="likes" value="draw">繪畫
<input type="checkbox" name="likes" value="run">跑步<br/>
簡介:<textarea rows="6" cols="60" name="description"></textarea><hr/>
照片:<input type="file" name="image"><br/>
<input type="hidden" name="id", value="123456"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
package cn.cast.request;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RequestDemo3 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println(request.getParameter("username"));
System.out.println(request.getParameter("passwd"));
System.out.println(request.getParameter("gender"));
System.out.println(request.getParameter("city"));
String likes[] =request.getParameterValues("likes");
for(int i=0;likes!=null&&i<likes.length;i++){
System.out.println(request.getParameter(likes[i]));
}
System.out.println(request.getParameter("description"));
System.out.println(request.getParameter("id"));
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
請求引數的中文亂碼的問題
瀏覽器預設傳送資料的碼錶是當前開啟頁面的碼錶,伺服器在獲取引數的時候需要request.setCharacterEncoding("UTF-8");設定request的查詢碼錶
package cn.cast.request;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RequestDemo4 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//request.setCharacterEncoding("UTF-8"); //只對post請求有效
test1(request);
}
//post請求中文亂碼的解決方案
private void test2(HttpServletRequest request)
throws UnsupportedEncodingException {
request.setCharacterEncoding("UTF-8"); //只對post請求有效
System.out.println(request.getParameter("username"));
System.out.println(request.getParameter("passwd"));
}
//get請求中文亂碼的解決方案
private void test1(HttpServletRequest request)
throws UnsupportedEncodingException {
String username =request.getParameter("username");
username = new String(username.getBytes("iso8859-1"),"UTF-8");
System.out.println(request.getParameter(username));
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
請求轉發,以及使用request域物件把資料帶給轉發資源
由requestDemo5將資料傳輸到message.jsp
message.jsp
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'message.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%
String data1 = (String)request.getAttribute("data");
out.write(data1);
%>
</body>
</html>
package cn.cast.request;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//請求轉發,以及使用request域物件把資料帶給轉發資源
// mvc (model javabean v view jsp c controller servlet)
public class RequestDemo5 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String data = "aaa";
//getServletContext() 多個程式訪問時資料會發生改變 不安全
//this.getServletContext().setAttribute("data", data);
//每個請求都會產生一個request物件 ,通過request傳送資料是安全的
request.setAttribute("data", data);
//request也可以實現轉發
request.getRequestDispatcher("/message.jsp").forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
package cn.cast.request;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RequestDemo6 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String data = "aaa";
PrintWriter writer = response.getWriter();
writer.write(data);
writer.close();
request.setAttribute("data", data);
//以下跳轉將發生異常
request.getRequestDispatcher("/message.jsp").forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
程式將丟擲異常
java.lang.IllegalStateException: Cannot forward after response has been committed
用include實現頁面包含
package cn.cast.request;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//用include實現頁面包含
import sun.reflect.ReflectionFactory.GetReflectionFactoryAction;
//用於在在當前頁面包含公共頁面
public class RequestDemo7 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("/public/head.jsp").include(request, response);
response.getWriter().write("haha");
request.getRequestDispatcher("/public/foot.jsp").include(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
web工程中各地址的寫法
package cn.cast.request;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//地址的寫法
import sun.reflect.ReflectionFactory.GetReflectionFactoryAction;
public class RequestDemo7 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1
request.getRequestDispatcher("/form.html").forward(request, response);
//2
response.sendRedirect("/web1/form.html");
//3
this.getServletContext().getRealPath("/form.html");
//4
this.getServletContext().getResourceAsStream("/public/");
//5
//<a href="/web1/...">bbb</a>
//<form action="/web1/..." method=""></form>
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
request實現防盜鏈
package cn.cast.request;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RequestDemo8 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("/web1/index.jsp"); //重定向到首頁
return; //如果這行地區愛嗎執行 後面的程式碼就不執行
}
String data ="aaa";
response.getWriter().write(data);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}