HttpServletRequest
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息
request常用方法
l获得客户机信息
•getRequestURL方法返回客户端发出请求时的完整URL。
•getRequestURI方法返回请求行中的资源名部分。
•getQueryString 方法返回请求行中的参数部分。
•getRemoteAddr方法返回发出请求的客户机的IP地址
•getRemoteHost方法返回发出请求的客户机的完整主机名
•getRemotePort方法返回客户机所使用的网络端口号
•getLocalAddr方法返回WEB服务器的IP地址。
•getLocalName方法返回WEB服务器的主机名
•getMethod得到客户机请求方式
URL和URI的关系:URI是URL的父类,URI描述资源,URL描述互联网的资源
String url = request.getRequestURL().toString();
System.out.println(url);
System.out.println(request.getRequestURI());
System.out.println(request.getQueryString());
System.out.println(request.getRemoteAddr());
System.out.println(request.getRemoteHost());
System.out.println(request.getRemotePort());
System.out.println(request.getMethod());
Request常用方法
l获得客户机请求头
•getHead(name)方法
•getHeaders(String name)方法
•getHeaderNames方法
l获得客户机请求参数(客户端提交的数据)
•getParameter(name)方法
•getParameterValues(String name)方法
•getParameterNames方法
•getParameterMap方法 //
•getInputStream
获取客户机带过来的数据
String username = request.getParameter("username");
System.out.println(username);
System.out.println("----------------------");
Enumeration e = request.getParameterNames();
while(e.hasMoreElements()){
String name =(String) e.nextElement();
String value = request.getParameter(name);
System.out.println(name + "=" + value);
}
System.out.println("----------------------");
String values[] =request.getParameterValues("username");
for(int i=0;values!=null &&i<values.length;i++){
System.out.println(values[i]);
}
System.out.println("----------------------");
//http://localhost:8080/day05/servlet/RequestDemo3?username=aaa&username=bbb&password=123
Map<String,String[]>map = request.getParameterMap();
Set<Map.Entry<String,String[]>> set = map.entrySet();
for(Map.Entry<String,String[]> entry : set){
username =entry.getKey();
values =entry.getValue();
for(int i=0;values!=null &&i<values.length;i++){
System.out.println(username +"=" + values[i]);
}
}
request常见应用1
l防盗链
String referer =request.getHeader("referer");
if(referer==null ||!referer.startsWith("http://localhost")){
response.sendRedirect("/day05/index.html");
return;
}
String data = "凤姐日记";
response.setCharacterEncoding("UTF-8");
response.setHeader("content-type", "text/html;charset=UTF-8");
response.getWriter().write(data);
l各种表单输入项数据的获取
•text、password、radio、checkbox、
•file、select、textarea、 hidden、
•image、button给js编程用
package cn.itcast.request;
import java.io.IOException;
import java.util.Arrays;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//获取不同类型表单的数据(获取客户机表单提交的数据)
public class RequestDemo5 extends HttpServlet {
publicvoid 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(Arrays.asList(request.getParameterValues("like")==null?newString[]{}:request.getParameterValues("like")));
System.out.println(request.getParameter("city"));
System.out.println(request.getParameter("resume"));
System.out.println(request.getParameter("xx"));
String username =request.getParameter("username"); //"" null
if(username==null ||username.trim().equals("")){
System.out.println("您没有提交数据");
}
request.getParameter("gender"); //null
request.getParameterValues("like");//null
}
publicvoid doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
form表单:
<!DOCTYPE HTML PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN">
<html>
<head>
<title>form.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>
<form action="/day05/servlet/RequestDemo5"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/>
爱好:<input type="checkbox"name="like" value="basketball">蓝球
<input type="checkbox"name="like" value="football">足球
<input type="checkbox"name="like" value="java">java
<input type="checkbox"name="like" value=".net">.net
<br/>
所在地:<select name="city">
<option value="bj">北京</option>
<option value="sh">上海</option>
<option value="cs">长沙</option>
</select><br/>
简历:<textarea rows="5"cols="60" name="resume"></textarea><br/>
大头照:<input type="file" name="image"><br/>
<input type="hidden"name="xx" value="yyy">
<input type="submit" value="提交">
</form>
<form action="/day05/servlet/RequestDemo6"method="get">
用户名:<input type="text"name="username"><br/>
<input type="submit" value="提交">
</form>
<form action="/day05/servlet/RequestDemo7"method="post">
用户名:<input type="text"name="username"><br/>
<input type="submit" value="提交">
</form>
<!-- 超链接后面带中文数据一定要经过url编码 -->
<a href="/day05/servlet/RequestDemo8?name=方立勋">点点</a>
</body>
</html>
如果都没有添 或选择,输入项默认为空串“”,选择项为NUll
所以最好用这种方式进行比较判断:if(username==null ||username.trim().equals("")){
l请求参数的中文乱码问题
importjava.io.IOException;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
//request的乱码问题:get\post
public classRequestDemo6 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponseresponse)
throwsServletException, IOException {
//以下代码可以解决post提交的乱码
request.setCharacterEncoding("UTF-8"); //只对post方式有效
//String username1 =request.getParameter("username");
//System.out.println(username1);
//以下代码可能解决get提交的乱码
String username2 =request.getParameter("username");
//username2 = newString(username2.getBytes("iso8859-1"),"UTF-8");
System.out.println(username2);
}
public void doPost(HttpServletRequest request,HttpServletResponse response)
throwsServletException, IOException {
doGet(request,response);
}
}
importjava.io.IOException;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
//思考题 :下面程序有乱码吗????
public classRequestDemo7 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponseresponse)
throwsServletException, IOException {
request.setCharacterEncoding("UTF-8");
String username = request.getParameter("username"); //方立
response.setCharacterEncoding("gb2312");
response.setContentType("text/html;charset=gb2312");
response.getWriter().write(username);
}
public void doPost(HttpServletRequest request,HttpServletResponse response)
throwsServletException, IOException {
doGet(request,response);
}
}
lURL地址的编码
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//超链接提交中文数据 在服务器端获取的代码
/*
* <!-- 超链接后面带中文数据一定要经过url编码 -->
<a href="/day05/servlet/RequestDemo8?name=方立勋">点点</a>
*
*/
public class RequestDemo8 extendsHttpServlet {
publicvoid doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Stringname = request.getParameter("name");
name= new String(name.getBytes("iso8859-1"),"UTF-8");
System.out.println(name);
}
publicvoid doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
request常见应用2
lrequest对象实现请求转发:请求转发指一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理。
l请求转发的应用场景:MVC设计模式
lrequest对象提供了一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发。
lrequest对象同时也是一个域对象,开发人员通过request对象在实现转发时,把数据通过request对象带给其它web资源处理。
setAttribute方法
getAttribute方法
removeAttribute方法
getAttributeNames方法
* 请求转发的特点:
* 1.请求转发对浏览器而言只发了一次请求,并且浏览器的地址栏不会发生变化
* 2.请求转发下,服务器只会创建一个request response
*
* 请求转发应用场景mvc设计模式
* 在mvc设计模式下,都是servlet处理请求,处理请求产生数据后,servlet会把数据存储request域,然后转发给jsp显示
*
String data = "aaaa";
request.setAttribute("data", data);
request.setAttribute("data", data);
RequestDispatcher rd =request.getRequestDispatcher("/view.jsp");
rd.forward(request, response);
请求转发的细节
lforward方法用于将请求转发到RequestDispatcher对象封装的资源。
l如果在调用forward方法之前,在Servlet程序中写入的部分内容已经被真正地传送到了客户端,forward方法将抛出IllegalStateException异常。
l如果在调用forward方法之前向Servlet引擎的缓冲区(response)中写入了内容,只要写入到缓冲区中的内容还没有被真正输出到客户端,forward方法就可以被正常执行,原来写入到输出缓冲区中的内容将被清空,但是,已写入到HttpServletResponse对象中的响应头字段信息保持有效
String data = "aaa";
response.getWriter().write(data); //浏览器不会看到这个数据的输出
request.getRequestDispatcher("/index.jsp").forward(request, response);
String data2 = "bbb";
response.getWriter().write(data2); //浏览器不会看到这个数据的输出
请求重定向和请求转发的区别
l一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理,称之为请求转发。
l一个web资源收到客户端请求后,通知浏览器去访问另外一个web资源,称之为请求重定向。
lRequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的组件;而HttpServletResponse.sendRedirect方法还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。
l如果传递给HttpServletResponse.sendRedirect 方法的相对URL以“/”开头,它是相对于整个WEB站点的根目录;如果创建RequestDispatcher对象时指定的相对URL以“/”开头,它是相对于当前WEB应用程序的根目录。
l调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;调用RequestDispatcher.forward方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。
lHttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。
lRequestDispatcher.forward方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。
RequestDispatcher
linclude方法:
•RequestDispatcher.include方法用于将RequestDispatcher对象封装的资源内容作为当前响应内容的一部分包含进来,从而实现可编程的服务器端包含功能。
•被包含的Servlet程序不能改变响应消息的状态码和响应头,如果它里面存在这样的语句,这些语句的执行结果将被忽略
//动态包含
request.getRequestDispatcher("/servlet/HeadServlet").include(request, response);
String data = "aaa<br/>";
response.getWriter().write(data);
request.getRequestDispatcher("/servlet/FootServlet").include(request, response);
工程中“\”的用法:
服务器端“\”代表Web应用,客户端代表整个网站
this.getServletContext().getRealPath("/download/日本 妞.jpg");
this.getServletContext().getResourceAsStream("/download/日本 妞.jpg");
request.getRequestDispatcher("/login.html");
response.sendRedirect("/day05/index.jsp");
/*
<a href="/day05/message.jsp">点点</a>
<form action="/day05/servlet/FootServlet">
</form>
<img src="/day05/download/日本纽.jpg">
*/
}