request

request常用方法:

Servlet代码:

public class RequestDemo1 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		System.out.println(request.getRequestURI());
		System.out.println(request.getRequestURL());
		//返回请求行参数http://localhost:8080/day06/servlet/RequestDemo1?username=aaa
		System.out.println(request.getQueryString());
		
		System.out.println("=====================");
		
		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);
	}

}

request获取请求头:

Servlet代码:
//获取请求头相关的方法
	private void test1(HttpServletRequest request) {
		//如果有多个该头,getHeader只能获得第一个头的值
		String headValue = request.getHeader("Accept-Encoding");
		System.out.println(headValue);
		
		System.out.println("=======================");
		//getHeaders可以获得所有同名该头的值
		Enumeration e = request.getHeaders("Accept-Encoding");
		while(e.hasMoreElements()){
			String value = (String)e.nextElement();
			System.out.println(value);
		}
		
		System.out.println("=======================");
		//getHeaderNames可以获得所有头的名字
		e = request.getHeaderNames();
		while(e.hasMoreElements()){
			String name = (String)e.nextElement();
			String value = request.getHeader(name);
			System.out.println(value);
		}
	}

request获取请求数据:
html代码:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>带数据给RequestDemo2</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">

  </head>
  
  <body>
    <!-- 向服务器提交数据的两种方式 -->
    <a href="/day06/servlet/RequestDemo2?username=xxx">点点</a>
    
    <form action="/day06/servlet/RequestDemo2" method="post">
    	用户名1:<input type="text" name="username"/></br>
    	用户名2:<input type="text" name="username"/></br>
    	密码:<input type="text" name="password"/></br>
    	<input type="submit" value="提交"/></br>
    </form>
    
  </body>
</html>

Servlet代码:

//User对象,用于封装提交的数据
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;
	}
	
}
//获取请求数据
	//获取请求数据时一般来说都要先检查再使用
	//防止用户吃饱了撑的不输入数据或者只输入空格就提交,报异常
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		System.out.println("==========获取数据方式1===========");
		//常用:获取指定参数的值
		String value = request.getParameter("username");
		if(value!=null&&!value.trim().equals("")){
			System.out.println(value);
		}
		
		System.out.println("==========获取数据方式2===========");
		Enumeration e =request.getParameterNames();
		while(e.hasMoreElements()){
			String name = (String)e.nextElement();//username password
			value = request.getParameter(name);
			if(value!=null&&!value.trim().equals("")){
				System.out.println(name+" = "+value);
			}
		}
		
		System.out.println("==========获取数据方式3===========");
		//getParameterValues得到所有同名参数的值
		String[] values = request.getParameterValues("username");
		for(int i =0;values!=null&&i<values.length;i++){
			System.out.println(values[i]);
		}
		//增强for循环
//		for(String v : values){
//			System.out.println(v);
//		}
		
		System.out.println("==========获取数据方式4===========");
		//常用:将数据封装到对象(user)中去,导入beanutils和logging包
		Map<String,String[]> map = request.getParameterMap();
		User user = new User();
		try {
			BeanUtils.populate(user, map);	//username String[] 用map集合的数据填充bean
			
			//bean的拷贝
			//把表单数据封装到formbean对象中,再将formbean拷贝到user对象
			//拷贝想成功,属性值必须是String或Buffer基本类型
//			BeanUtils.copyProperties(user, formbean); 
		} catch (Exception e1) {
			e1.printStackTrace();
		}
		System.out.println((String)user.getUsername()[1]);
		
		System.out.println("==========获取数据方式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));
		}
		
	}

request常见应用:



通过表单获取客户机数据:

html代码:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>传数据给requestDemo3</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">
    
  </head>
  
  <body>
  	<!-- url后面如果跟了中文数据,要编码后再提交 -->
    <form action="/day06/servlet/RequestDemo3" method="post">
    	用户名:<input type="text" name="username"/></br>
    	密码:<input type="password" name="password"/></br>
    	性别:
    		<input type="radio" name="gender" value="male"/>男
    		<input type="radio" name="gender" value="female"/>女<br/>
    	
    	所在地:
    		<select name="city">
    			<option value="beijing">北京</option>
    			<option value="shanghai">上海</option>
    			<option value="cs">长沙</option>
    		</select>
    		</br>
    	爱好:
    		<input type="checkbox" name="likes" value="sing"/>唱歌
    		<input type="checkbox" name="likes" value="dance"/>跳舞
    		<input type="checkbox" name="likes" value="basketball"/>篮球
    		<input type="checkbox" name="likes" value="football"/>足球
    		</br>
    	备注:<textarea rows="6" cols="60" name="description"></textarea></br>	
    	
    	大头照:<input type="file" name="image"/></br>
    	
    	<input type="hidden" name="id" value="12345"/>
    	
    	<input type="submit" value="提交"/></br>
    </form>
  </body>
</html>
Servlet代码:

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("password"));
		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(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中文乱码问题:
html代码:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>中文乱码</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">
    
  </head>
  
  <body>
    <form action="/day06/servlet/RequestDemo4" method="post">
    	用户名:<input type="text" name="username"/></br>
    	<input type="submit" value="提交"/></br>
    </form>
    
    <form action="/day06/servlet/RequestDemo4" method="get">
    	用户名:<input type="text" name="username"/></br>
    	<input type="submit" value="提交"/></br>
    </form>
    
    <!-- 超链接提交的中文,服务器想不乱码,也只能手工处理,因为超链接也是get提交 -->
     <a href="/day06/servlet/RequestDemo4?username=中国">点点</a>
  </body>
</html>

Servlet代码:

public class RequestDemo4 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		test3(request,response);
	}
	
	//测试题
	private void test3(HttpServletRequest request,HttpServletResponse response)
			throws IOException {
		
		request.setCharacterEncoding("UTF-8");
		String username = request.getParameter("username");
		
		response.setCharacterEncoding("gb2312");
		response.setHeader("Content-Type", "text/html;charset=gb2312");
		response.getWriter().write(username);
	}

	//解决post提交的乱码
	private void test2(HttpServletRequest request)
			throws UnsupportedEncodingException {
		
		request.setCharacterEncoding("UTF-8");
		String username = request.getParameter("username");
		System.out.println(username);
	}
	
	//解决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(username);
	}
	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}
request实现请求转发:
Servlet代码:

//请求转发,以及使用request域对象把数据带给转发资源
//请求转发的特点:
//1.客户端只发出一次请求,而服务器端有多个资源调用
//2.客户端浏览器地址栏没有变化
public class RequestDemo5 extends HttpServlet {

	//mvc	(m model(javabean) v view(jsp) c controller(servlet)	) 
	//controller(servlet)收到请求产生数据,使用model(javabean)封装,再把javabean存到request域里面带给view(jsp),有jsp取出数据输出
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		String data = "aaaaaa";
		
		//不同请求用不同的request域,所以不会覆盖
		request.setAttribute("data", data);
		
		//以前用ServletContext把数据转发到目标页面,但是现在不这样用,以免转发过程中,另一个请求覆盖前一个请求的数据
//		this.getServletContext().setAttribute("data", data);
		
		//request也可以实现转发
		request.getRequestDispatcher("/message.jsp").forward(request, response);
		
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}
jsp代码:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'message.jsp' starting page</title>
  </head>
  
  <body>
  
  	<!-- 自动从四个域里面找到data并输出,jsp不要出现java代码 -->
  	${data }
  
  	<%
  		//和上边jsp代码一样效果
  		String data = (String)request.getAttribute("data");
  		out.write(data);
  	 %>

  </body>
</html>
请求转发的细节:

Servlet代码:

//forward的细节,以下代码会抛异常(forward之前,若有内容已经发送到了客户端,则报异常)
public class RequestDemo6 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		String data = "aaaaaa";
		
		PrintWriter writer = response.getWriter();
		writer.write(data);//数据写到response里
		writer.close();//关闭流后,则数据真正从response写到客户端
		
		if(true){
			request.getRequestDispatcher("/index.jsp").forward(request, response);//把数据转发到jsp再发送给客户端,也一样属于此异常
			return;//所以跳转后要return不执行下面转发语句,否则也会报异常
		}
		
		//以下转发会导致:java.lang.IllegalStateException:Cannot forward after response has been committed
		request.getRequestDispatcher("/message.jsp").forward(request, response);
		
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

//forward细节:forward时,会清空response中的数据
public class RequestDemo7 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		String data = "aaaaaa";
		response.getWriter().write(data);
		
		//forward跳转之前会把response中的数据清空,所以看不到aaaaaa
		request.getRequestDispatcher("/index.jsp").forward(request, response);
		
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

request实现页面包含:

head.jsp代码:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

    head<br/>

foot.jsp代码:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

   foot<br/>
Servlet代码:
//用include实现页面包含(被包含页面不要出现全局架构标签)
public class RequestDemo8 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		request.getRequestDispatcher("/public/head.jsp").include(request, response);
		
		response.getWriter().write("hahahaha<br/>");
		
		request.getRequestDispatcher("/public/foot.jsp").include(request, response);
		
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}


web工程中各类地址的写法:

Servlet代码:

//web工程中各类地址的写法:
//所有地址以"/"开头,
//若是给服务器用的,"/"就代表当前web应用
//若是给浏览器用的,"/"就代表网站
public class ServletDemo1 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		//1.
		request.getRequestDispatcher("/form1.html").forward(request, response);
		
		//2.
		response.sendRedirect("/day06/form1.html");
		
		//3.
		this.getServletContext().getRealPath("/form1.html");
		
		//4.
		this.getServletContext().getResourceAsStream("/public/foot.jsp");
		
		//5.
		/*
		   <a href="/day06/form1.html">点点</a>
		 * 
		   <form action="/day06/form1.html">
		   
		   </form>
		 */
		
		//6.
		response.setHeader("refresh", "3;url='/day06/form1.html'");
		
		/*
		  c:\\	硬盘下路径用\\
		  http://	浏览器网址用//
		
		*/
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

利用referer防盗链:
首页index.jsp代码:

<%@ page language="java" import="java.util.*" pageEncoding=UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'index.jsp' starting page</title>
  </head>
  
  <body>
  	<br/>看广告<br/>
  	
    <a href="/day06/servlet/RequestDemo9">看凤姐</a>
  </body>
</html>

Servlet代码:

//假设资源链接为http://localhost:8080/day06/servlet/RequsetDemo9
//防盗链
public class RequestDemo9 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.setStatus(302);
			response.setHeader("Location", "/day06/index.jsp");
			return;	//用return不必用else
		}
		
		response.setCharacterEncoding("UTF-8");
		response.setHeader("Content-Type", "text/html;charset=UTF-8");
		String data = "凤姐日记";
		response.getWriter().write(data);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}


 

posted @ 2013-04-23 17:11  魅惑之眼  阅读(182)  评论(0编辑  收藏  举报