request常用方法
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//HttpServletRequest的常用方法 http请求中的所有信息都封装在这个对象中
public class RequestDemo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 访问路径http://localhost:8080/day06/servlet/RequestDemo1?name=aaa
// /day06/servlet/RequestDemo1
System.out.println(request.getRequestURI());
// http://localhost:8080/day06/servlet/RequestDemo1
System.out.println(request.getRequestURL());
// name=aaa
System.out.println(request.getQueryString());
// 获取客户端ip
System.out.println(request.getRemoteAddr());
// 获取客户端主机名,这个主机名没有在DNS上注册的话还是获取ip
System.out.println(request.getRemoteHost());
// 获取客户端浏览器的端口
System.out.println(request.getRemotePort());
// 获取web服务器的ip
System.out.println(request.getLocalAddr());
// 获取web服务器的主机名,没有在DNS上注册还是获取ip
System.out.println(request.getLocalName());
// 获取请求方式
System.out.println(request.getMethod());
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
request获取请求头和请求数据
import java.io.IOException;
import java.io.InputStream;
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 com.sun.org.apache.commons.beanutils.BeanUtils;
//HttpServletRequest获取请求头和请求数据
//请求数据一半来说要先检查再使用,检查非空和不是空格
public class RequestDemo2 extends HttpServlet {
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 paramName = (String) e.nextElement();
String value2 = request.getParameter(paramName);
System.out.println(paramName + "=" + value2);
}
System.out.println("---------获取请求数据方式3-------------");
// 获取所有的请求数据,同名的只能获取一次,就是第一次
String[] values = request.getParameterValues("username");
for (int i = 0; values != null && i < values.length; i++) {
System.out.println(values[i]);
}
System.out.println("---------获取请求数据方式4-------------");
// 这个特别实用,框架的模型驱动,这个Map的value肯定是String数组类型,因为有同名的请求数据
// 实际开发中是不会 request.getParameter("username");用这种方式的,都是要创建一个model的
Map<String, String[]> map = request.getParameterMap();
User user = new User();
try {
// 用map中的数据填充bean
BeanUtils.populate(user, map);
} catch (IllegalAccessException e1) {
e1.printStackTrace();
} catch (InvocationTargetException e1) {
e1.printStackTrace();
}
System.out.println(user.getPassword());
System.out.println("---------获取请求数据方式5-------------");
// request.getInputStream();是上传文件的时候获取数据的方式
// 普通数据是获取不到的
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) {
System.out.println("---------获取请求头方式1-------------");
// 拿到指定的请求头
System.out.println(request.getHeader("cache-control"));
System.out.println("---------获取请求头方式2-------------");
// 拿到所有指定的请求头
Enumeration e = request.getHeaders("cache-control");
while (e.hasMoreElements()) {
String headValue = (String) e.nextElement();
System.out.println(headValue);
}
System.out.println("---------获取请求头方式3-------------");
// 拿到所有请求头
Enumeration e1 = request.getHeaderNames();
while (e1.hasMoreElements()) {
String headerName = (String) e1.nextElement();
String headValue = request.getHeader(headerName);
System.out.println(headerName + "=" + headValue);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
public class User {
private String[] username;
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;
}
private String password;
}
前台页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>给RequestDemo2发送请求数据</title>
</head>
<body>
<!-- 浏览器可以通过两种方式向服务器发送请求数据 超链接方式后面跟了中文要经过url编码后再提交 -->
<a href="/day06/servlet/RequestDemo2?username=xxx">点点</a><br/>
<form action="/day06/servlet/RequestDemo2" method="post">
用户名1:<input type="text" name="username"/><br/>
用户名2:<input type="text" name="username"/><br/>
密码:<input type="password" name="password"/><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
注:此程序还需用到commons-beanutils-1.9.0.jar和commons-logging-1.1.3.jar这两个jar包。
通过表单提交用户数据和用request获取表单提交数据
表单页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>收集用户数据,向RequestDemo3提交数据</title>
</head>
<body>
<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="shenzhen">深圳</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="hidden" name="id" value="123456"/>
<input type="submit" value="提交" />
</form>
</body>
</html>
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
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;
//获取表单提交数据
public class RequestDemo3 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
test2(request);
}
// 实际开发项目时采用的model方式
private void test2(HttpServletRequest request) {
User user = new User();
Map<String, String[]> map = request.getParameterMap();
try {
BeanUtils.populate(user, map);
System.out.println(user.getUsername());
System.out.println(user.getPassword());
System.out.println(user.getGender());
System.out.println(user.getCity());
String[] likes = user.getLikes();
for (int i = 0; likes != null && i < likes.length; i++) {
System.out.println(likes[i]);
}
System.out.println(user.getDescription());
System.out.println(user.getId());
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
// 直接获取值得方法
private void test1(HttpServletRequest request) {
String username = request.getParameter("username");
System.out.println(username);
String password = request.getParameter("password");
System.out.println(password);
String gender = request.getParameter("gender");
System.out.println(gender);
String city = request.getParameter("city");
System.out.println(city);
String[] likes = request.getParameterValues("likes");
for (int i = 0; likes != null && i < likes.length; i++) {
System.out.println(likes[i]);
}
String description = request.getParameter("description");
System.out.println(description);
String id = request.getParameter("id");
System.out.println(id);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
public class User {
private String username;
private String password;
private String gender;
private String city;
private String[] likes;
private String description;
private String id;
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 String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String[] getLikes() {
return likes;
}
public void setLikes(String[] likes) {
this.likes = likes;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
request乱码问题(数据提交以post方式和get方式)
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>向RequestDemo4提交中文数据,解决乱码问题</title>
</head>
<body>
<!--post方式提交-->
<form action="/day06/servlet/RequestDemo4" method="post">
用户名:<input type="text" name="username" /> <input type="submit"
value="提交" />
</form>
<!--get方式提交-->
<form action="/day06/servlet/RequestDemo4" method="get">
用户名:<input type="text" name="username" /> <input type="submit"
value="提交" />
</form>
<!-- 超链接方式提交的中文,服务器想不乱码,也只能手工处理(貌似超链接提交要经过url编码)-->
<a href="/day06/servlet/RequestDemo4?username=中国">单击</a>
</body>
</html>
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//request乱码解决,除了下面的解决方式,还可以改服务器配置,但不要用那种方式
public class RequestDemo4 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
test2(request);
}
/*
* get方式提交:由于get方式提交request.setCharacterEncoding(arg0);无效,所以乱码只能手工处理,拿到乱码的数据后
* ,按照ISO8859-1进行解码,然后按照UTF-8进行编码。
*/
private void test2(HttpServletRequest request)
throws UnsupportedEncodingException {
String username = request.getParameter("username");
// get方式解决乱码,先把乱码按照原来的编码解码,返回数据的表示数字,然后按照想要的码表编码
username = new String(username.getBytes("ISO8859-1"), "UTF-8");
System.out.println(username);
}
/*
* post方式提交:浏览器以当前页面的码表提交数据,当前页面的码表是程序员写程序时自己指定的。数据提交到request里面去,
* 但是当request往外面取数据时用的是ISO8859
* -1码表,就会产生乱码所以要在取数据之前指定request的码表。request.setCharacterEncoding
* (arg0);只对post方式起作用
*/
private void test1(HttpServletRequest request)
throws UnsupportedEncodingException {
// 设置request码表
request.setCharacterEncoding("UTF-8");
String username = request.getParameter("username");
System.out.println(username);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
request实现请求转发以及request域带数据给转发资源
MVC思想:
M model javabean
V view(jsp)
C Cotroller(servlet)
servlet把数据提交,javabean封装数据,然后jsp从javabean取出数据。
请求转发特点:
1. 客户端只发一次请求,而服务器有多个资源调用
2. 浏览器地址栏没有变化
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//request请求转发,以及使用request域把数据带给转发资源,实际开发中MVC设计模式,都是用request域把数据带给jsp的
public class RequestDemo5 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String date = "aaaaaa";
// 将数据存到request域中
request.setAttribute("date", date);
// 请求转发,servletContext也可以实现请求转发
request.getRequestDispatcher("/message.jsp").forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
${date}
<!-- 实际开发中 是不允许jsp页面中出现java代码的,都是用自定义标签和EL表达式替换java代码 -->
<%
//request的getParameter方法得到的是请求数据,getAttribute方法得到的是request域里的数据
String message = (String)request.getAttribute("date");
out.write(message);
%>
</body>
</html>
request请求转发forward方法的细节
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请求转发时forward方法的细节,客户端只发一次请求,而服务器端有多个资源调用,地址栏不会发生变化
/*
* 1. forward方法用于将请求转发到RequestDispatcher对象封装的资源,
* 2. 如果在调用forward方法之前,在servlet程序中写入的部分内容已经被真正的传送到了客户端(调用了flush或者close方法),
* forward方法将抛出IllegalStateException异常
* 3. 如果在调用forward方法之前向Servlet引擎的缓冲区(response)中写入了内容,
* 只要写入到缓冲区的内容还没有被真正输出到客户端,forward方法就可以被正常执行,
* 原来写入到缓冲区中的内容将被清空,但是,以写入到HttpServletResponse对象中的响应头字段信息保持有效
*/
public class RequestDemo6 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
test3(request, response);
}
//细节3
private void test3(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
String date = "aaaaaa";
PrintWriter print = response.getWriter();
print.write(date);
//以下代码不会出现问题,但是上面的date是不能在页面输出的,页面中只能看见index.jsp的内容
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
//细节2,转发了好多次,避免这个问题,forward之后要return
private void test2(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String date = "aaaaaa";
if(true) {
//几百行代码
request.getRequestDispatcher("/index.jsp").forward(request, response);
//return; //跳转之后一定要记得return
}
//几百行代码
// 以下代码将出现:java.lang.IllegalStateException: Cannot forward after response has been committed
//上面已经转发一次了
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
//细节2
private void test1(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
String date = "aaaaaa";
PrintWriter print = response.getWriter();
print.write(date);
print.flush();//print.close();
// 以下代码将出现:java.lang.IllegalStateException: Cannot forward after response has been committed
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
request使用RequestDispatcher的include方法实现页面包含
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//request使用RequestDispatcher的include方法实现页面包含
public class RequestDemo7 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("/head.jsp").include(request, response);
response.getWriter().write("aaaaaa");
request.getRequestDispatcher("/foot.jsp").include(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
工程中各类地址的写法
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//web工程中各类地址的写法
//写地址最好以/开头,如果是给服务器用的,/代表当前的web应用;如果地址是给浏览器用的,/代表网站(webapps文件夹)
//相对路径的话单独问题单独解决
public class ServletUrlDemo extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1.给服务器用
request.getRequestDispatcher("/").forward(request, response);
// 2.给浏览器用,让浏览器重定向
response.sendRedirect("/");
// 3.给服务器用
this.getServletContext().getRealPath("/");
// 4.给服务器用
this.getServletContext().getResourceAsStream("/");
// 5.
/*
* //给浏览器用的 <a href="/">点击</a> //给浏览器用的 <form action="/">
*
* </form>
*/
// 要想获取url资源用/这个斜杠,获取硬盘上的资源,用\\斜杠
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
request获取referer请求头实现防盗链
eg:有的资源你点出后会有广告,广告旁边是资源连接,有些人直接把资源连接发给别人,企图不看广告直接进入链接拿资源,为了防止盗链行为的发生,我们要检测用户访问url的情况来进行一系列措施。
需要实现的功能就是,当用户想要查看”机密文档”的时候,如果是直接输入机密文档的url,而不是广告的url,我们得先让他跳转到广告页面的url,看完广告后就可以让他看“机密文档”了。
模拟过程:用户输入机密文件的url(或者在其他网站),这时候进入Servlet,response的getHeader(“referer”)方法会得到来访地址,用此判断是否是从index.jsp网页的url来的,如果不是,跳入带广告的index.jsp,如果是就把机密文件的内容加载,然后显示给用户。
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//利用referer请求头实现防盗链
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("/day06/index.jsp");
// 然后return,不要输出后面的内容了
return;
}
String date = "凤姐日记";
response.getWriter().write(date);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}