servlet web之httpservletrequest
目录
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);
}
}