1. 程式人生 > >servlet web之httpservletrequest

servlet web之httpservletrequest

目錄

 

request的常用方法

request獲取請求頭和請求資料

獲取使用者資料 

請求引數的中文亂碼的問題

請求轉發,以及使用request域物件把資料帶給轉發資源

用include實現頁面包含  

web工程中各地址的寫法 

 request實現防盜鏈


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);
	}

}