JavaWeb_request_response(下)
2012-11-01 12:47
337 查看
HttpServletRequest
l HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。
Request常用方法
l 获得客户机信息
• getRequestURL方法返回客户端发出请求时的完整URL。
• getRequestURI方法返回请求行中的资源名部分。
• getQueryString 方法返回请求行中的参数部分。
• getPathInfo方法返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头。
• getRemoteAddr方法返回发出请求的客户机的IP地址
• getRemoteHost方法返回发出请求的客户机的完整主机名
• getRemotePort方法返回客户机所使用的网络端口号
• getLocalAddr方法返回WEB服务器的IP地址。
• getLocalName方法返回WEB服务器的主机名
package cn.itcast.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 RequestDemo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println(request.getRequestURI());
System.out.println(request.getRequestURL());
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());
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
在IE中输入http://localhost:8080/day06/servlet/RequestDemo1 得到
/day06/servlet/RequestDemo1
http://localhost:8080/day06/servlet/RequestDemo1
null
127.0.0.1
127.0.0.1
3112
GET
l 获得客户机请求头
• getHeader方法
• getHeaders方法
• getHeaderNames方法
package cn.itcast.request;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
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;
//获取请求头
public class RequestDemo2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String headValue= request.getHeader("Accept-Encoding");
System.out.println(headValue);
System.out.println("--------------------");
Enumeration e= request.getHeaders("Accept-Encoding");
while(e.hasMoreElements()){
String value=(String) e.nextElement();
System.out.println(value);
}
System.out.println("---------另一种方法-----------");
e=request.getHeaderNames();
while(e.hasMoreElements()){
String name=(String)e.nextElement();
String value =request.getHeader(name);
System.out.println(name +"=" +value);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
在Console中输出结果
gzip, deflate
--------------------
gzip, deflate
---------另一种方法-----------
accept=application/x-shockwave-flash, image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, *
System.out.println("---------获取数据方式4-----------");
//Map<String, String[]> map=request.getParameterMap();
Map map= request.getParameterMap();//开发中常用的(简化代码)
User user =new User();
try {
BeanUtils.populate(user, map);//username String[]//用map集合数据填充bean
//BeanUtils.copyProperty(user, formbean);bean的拷贝
} catch (Exception e1) {
e1.printStackTrace();
}
System.out.println(user);
System.out.println("---------获取数据方式5-----------");
InputStream in=request.getInputStream();
int len=0;
byte buffer[]=new byte[1024];//用到流就必须要这个框架,实际开发不太用
while((len=in.read())>0){//处理文件上传的
System.out.println(len);
System.out.println(new String (buffer,0,len));
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
Text.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="提交">
</form>
</body>
</html>
User.java(在获取数据方式4-里用到的)
package cn.itcast.url;
public class User {
private String username;
private String passwrod;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPasswrod() {
return passwrod;
}
public void setPasswrod(String passwrod) {
this.passwrod = passwrod;
}
}输出结果:
注意,本代码中的在获取数据方式4中,需要两个jar包,commons-logging.jar和commons-beanutils-1.8.3.jar
--------获取数据方式1------------
xxxx
--------获取数据方式2------------
password=123
username=xxxx
---------获取数据方式3-----------
Xxxx
Yyyyy
---------获取数据方式4-----------
cn.itcast.url.User@8ca0d9
request常见应用1
l 防盗链
l 各种表单输入项数据的获取
• text、password、radio、checkbox、
• file、select、textarea、 hidden、
• image、button给js编程用
form.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 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="/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="12356">
<input type="submit" value="提交">
</form>
</body>
</html>
package cn.itcast.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("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);
}
}
在IE中输入http://localhost:8080/day06/form.html 输入相应的值,在Console下得到数值
l 请求参数的中文乱码问题
form.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">
用户名1: <input type="text" name="username"><br/>
<input type="submit" value="提交"><br/>
</form>
<form action="/day06/servlet/RequestDemo4" method="get">
用户名1: <input type="text" name="username"><br/>
<input type="submit" value="提交"><br/>
</form>
<!-- 超链接提交的中文,服务器想不乱码,也只能手工处理 -->
<a href="/day06/servlet/RequestDemo4?username=中国">点点</a>
</body>//超链中的中文,用解决post的方法来解决
</html>
package cn.itcast.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乱码只对post提交有效
String username = request.getParameter("username");
//解决get提交的乱码(手工处理)
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);
}
}
在IE中输入http://localhost:8080/day06/form3.html
还有一种是改服务器的配置,但是这种只需要了解的,
request常见应用2
l request对象实现请求转发:请求转发指一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理。
l 请求转发的应用场景:MVC设计模式(jsp中不能出现一行java代码)
l request对象提供了一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发。
l request对象同时也是一个域对象,开发人员通过request对象在实现转发时,把数据通过request对象带给其它web资源处理。
ü setAttribute方法
ü getAttribute方法
ü removeAttribute方法
ü getAttributeNames方法
package cn.itcast.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就对象把数据带给转发资源
//请求转发的特点:
//1、客户端只发一个请求,而服务器有多个资源调用
//2、客户端浏览器地址栏没有变化
public class RequestDemo5 extends HttpServlet {
//MVC(M(model) javabean封装 V(view)jsp输出 C:cotroller(servlet))控制
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String data ="aaaaaa";
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);
}
}
Message.jsp
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'message.jsp' starting page</title>
</head>
<body>
${data} //el表达式与下个一样的含义
<%
String data = (String) request.getAttribute("data");
out.write(data);
%>
<%
String message = (String) application.getAttribute("message");
out.write(message);
%>
</body>
</html>//在IE中输入http://localhost:8080/day06/servlet/RequestDemo5 立即转到 message.jsp输出
请求转发的细节
l forward方法用于将请求转发到RequestDispatcher对象封装的资源。
l 如果在调用forward方法之前,在Servlet程序中写入的部分内容已经被真正地传送到了客户端,forward方法将抛出IllegalStateException异常。
package cn.itcast.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;
//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);
writer.close();
//以下跳转会导致:java.lang.IIIegalStateExcption 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);
}
}
Index.jsp是上次的,
l 如果在调用forward方法之前向Servlet引擎的缓冲区中写入了内容,只要写入到缓冲区中的内容还没有被真正输出到客户端,forward方法就可以被正常执行,原来写入到输出缓冲区中的内容将被清空,但是,已写入到HttpServletResponse对象中的响应头字段信息保持有效。
package cn.itcast.request;
import java.io.IOException;
……………………………..
//forward时,会清空response中的数据
public class RequestDemo7 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String data = "aaaaa";
response.getWriter().write(data);
request.getRequestDispatcher("/index.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>
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
<a href="/day06/servlet/ResponseDemo6" >bbbbb</a>
</body>
</html>在IE中输入http://localhost:8080/day06/servlet/RequestDemo7 输出的页面是bbbbb 覆盖了aaaaa
请求重定向和请求转发的区别
l 一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理,称之为请求转发。
l 一个web资源收到客户端请求后,通知浏览器去访问另外一个web资源,称之为请求重定向。
l RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的组件;而HttpServletResponse.sendRedirect 方法还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。
l 如果传递给HttpServletResponse.sendRedirect 方法的相对URL以“/”开头,它是相对于整个WEB站点的根目录;如果创建RequestDispatcher对象时指定的相对URL以“/”开头,它是相对于当前WEB应用程序的根目录。
l 调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;调用RequestDispatcher.forward 方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。
l HttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。
l RequestDispatcher.forward方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。
RequestDispatcher
l include方法:
• RequestDispatcher.include方法用于将RequestDispatcher对象封装的资源内容作为当前响应内容的一部分包含进来,从而实现可编程的服务器端包含功能。
• 被包含的Servlet程序不能改变响应消息的状态码和响应头,如果它里面存在这样的语句,这些语句的执行结果将被忽略。
package cn.itcast.request;
import java.io.IOException;
…………………………
//用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("hahahahh<br/>");
request.getRequestDispatcher("/public/foot.jsp").include(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
在WEB-INF目录新建一个文件public,在里面建立两个jsp(head.jsp和foot.jsp)
(在被包含的页面里不能出现那些全局架构标签)
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
head <br>
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
foot<br>
l 总结web工程中各类地址的写法
package cn.itcast.url;
import java.io.IOException;
…………………………...
//web工程中各类地址的写法
public class ServletDemo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1
request.getRequestDispatcher("/formm1.html").forward(request, response);
//2重定向
response.sendRedirect("/day06/form1.html");
//3
this.getServletContext().getRealPath("/form1.html");
//4
this.getServletContext().getRealPath("/public/foot.jsp");
//5
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
l 防盗链
package cn.itcast.request;
import java.io.IOException;
…………………………….
//防盗链(打开页面之后,先看广告,后看内容,就要是打广告的)
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.sendRedirect("/day06/index.jsp");
return;
}
String data = "凤姐日记";
response.getWriter().write(data);
}
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>
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
<a href="/day06/servlet/ResponseDemo6">bbbbb</a>
<br/>看广告<br/>
<a href="/day06/servlet/RequestDemo9">看凤姐</a>
</body>
</html>
l HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。
Request常用方法
l 获得客户机信息
• getRequestURL方法返回客户端发出请求时的完整URL。
• getRequestURI方法返回请求行中的资源名部分。
• getQueryString 方法返回请求行中的参数部分。
• getPathInfo方法返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头。
• getRemoteAddr方法返回发出请求的客户机的IP地址
• getRemoteHost方法返回发出请求的客户机的完整主机名
• getRemotePort方法返回客户机所使用的网络端口号
• getLocalAddr方法返回WEB服务器的IP地址。
• getLocalName方法返回WEB服务器的主机名
package cn.itcast.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 RequestDemo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println(request.getRequestURI());
System.out.println(request.getRequestURL());
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());
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
在IE中输入http://localhost:8080/day06/servlet/RequestDemo1 得到
/day06/servlet/RequestDemo1
http://localhost:8080/day06/servlet/RequestDemo1
null
127.0.0.1
127.0.0.1
3112
GET
l 获得客户机请求头
• getHeader方法
• getHeaders方法
• getHeaderNames方法
package cn.itcast.request;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
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;
//获取请求头
public class RequestDemo2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String headValue= request.getHeader("Accept-Encoding");
System.out.println(headValue);
System.out.println("--------------------");
Enumeration e= request.getHeaders("Accept-Encoding");
while(e.hasMoreElements()){
String value=(String) e.nextElement();
System.out.println(value);
}
System.out.println("---------另一种方法-----------");
e=request.getHeaderNames();
while(e.hasMoreElements()){
String name=(String)e.nextElement();
String value =request.getHeader(name);
System.out.println(name +"=" +value);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
在Console中输出结果
gzip, deflate
--------------------
gzip, deflate
---------另一种方法-----------
accept=application/x-shockwave-flash, image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, *
System.out.println("---------获取数据方式4-----------");
//Map<String, String[]> map=request.getParameterMap();
Map map= request.getParameterMap();//开发中常用的(简化代码)
User user =new User();
try {
BeanUtils.populate(user, map);//username String[]//用map集合数据填充bean
//BeanUtils.copyProperty(user, formbean);bean的拷贝
} catch (Exception e1) {
e1.printStackTrace();
}
System.out.println(user);
System.out.println("---------获取数据方式5-----------");
InputStream in=request.getInputStream();
int len=0;
byte buffer[]=new byte[1024];//用到流就必须要这个框架,实际开发不太用
while((len=in.read())>0){//处理文件上传的
System.out.println(len);
System.out.println(new String (buffer,0,len));
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
Text.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="提交">
</form>
</body>
</html>
User.java(在获取数据方式4-里用到的)
package cn.itcast.url;
public class User {
private String username;
private String passwrod;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPasswrod() {
return passwrod;
}
public void setPasswrod(String passwrod) {
this.passwrod = passwrod;
}
}输出结果:
注意,本代码中的在获取数据方式4中,需要两个jar包,commons-logging.jar和commons-beanutils-1.8.3.jar
--------获取数据方式1------------
xxxx
--------获取数据方式2------------
password=123
username=xxxx
---------获取数据方式3-----------
Xxxx
Yyyyy
---------获取数据方式4-----------
cn.itcast.url.User@8ca0d9
request常见应用1
l 防盗链
l 各种表单输入项数据的获取
• text、password、radio、checkbox、
• file、select、textarea、 hidden、
• image、button给js编程用
form.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 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="/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="12356">
<input type="submit" value="提交">
</form>
</body>
</html>
package cn.itcast.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("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);
}
}
在IE中输入http://localhost:8080/day06/form.html 输入相应的值,在Console下得到数值
l 请求参数的中文乱码问题
form.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">
用户名1: <input type="text" name="username"><br/>
<input type="submit" value="提交"><br/>
</form>
<form action="/day06/servlet/RequestDemo4" method="get">
用户名1: <input type="text" name="username"><br/>
<input type="submit" value="提交"><br/>
</form>
<!-- 超链接提交的中文,服务器想不乱码,也只能手工处理 -->
<a href="/day06/servlet/RequestDemo4?username=中国">点点</a>
</body>//超链中的中文,用解决post的方法来解决
</html>
package cn.itcast.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乱码只对post提交有效
String username = request.getParameter("username");
//解决get提交的乱码(手工处理)
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);
}
}
在IE中输入http://localhost:8080/day06/form3.html
还有一种是改服务器的配置,但是这种只需要了解的,
request常见应用2
l request对象实现请求转发:请求转发指一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理。
l 请求转发的应用场景:MVC设计模式(jsp中不能出现一行java代码)
l request对象提供了一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发。
l request对象同时也是一个域对象,开发人员通过request对象在实现转发时,把数据通过request对象带给其它web资源处理。
ü setAttribute方法
ü getAttribute方法
ü removeAttribute方法
ü getAttributeNames方法
package cn.itcast.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就对象把数据带给转发资源
//请求转发的特点:
//1、客户端只发一个请求,而服务器有多个资源调用
//2、客户端浏览器地址栏没有变化
public class RequestDemo5 extends HttpServlet {
//MVC(M(model) javabean封装 V(view)jsp输出 C:cotroller(servlet))控制
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String data ="aaaaaa";
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);
}
}
Message.jsp
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'message.jsp' starting page</title>
</head>
<body>
${data} //el表达式与下个一样的含义
<%
String data = (String) request.getAttribute("data");
out.write(data);
%>
<%
String message = (String) application.getAttribute("message");
out.write(message);
%>
</body>
</html>//在IE中输入http://localhost:8080/day06/servlet/RequestDemo5 立即转到 message.jsp输出
请求转发的细节
l forward方法用于将请求转发到RequestDispatcher对象封装的资源。
l 如果在调用forward方法之前,在Servlet程序中写入的部分内容已经被真正地传送到了客户端,forward方法将抛出IllegalStateException异常。
package cn.itcast.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;
//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);
writer.close();
//以下跳转会导致:java.lang.IIIegalStateExcption 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);
}
}
Index.jsp是上次的,
l 如果在调用forward方法之前向Servlet引擎的缓冲区中写入了内容,只要写入到缓冲区中的内容还没有被真正输出到客户端,forward方法就可以被正常执行,原来写入到输出缓冲区中的内容将被清空,但是,已写入到HttpServletResponse对象中的响应头字段信息保持有效。
package cn.itcast.request;
import java.io.IOException;
……………………………..
//forward时,会清空response中的数据
public class RequestDemo7 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String data = "aaaaa";
response.getWriter().write(data);
request.getRequestDispatcher("/index.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>
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
<a href="/day06/servlet/ResponseDemo6" >bbbbb</a>
</body>
</html>在IE中输入http://localhost:8080/day06/servlet/RequestDemo7 输出的页面是bbbbb 覆盖了aaaaa
请求重定向和请求转发的区别
l 一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理,称之为请求转发。
l 一个web资源收到客户端请求后,通知浏览器去访问另外一个web资源,称之为请求重定向。
l RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的组件;而HttpServletResponse.sendRedirect 方法还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。
l 如果传递给HttpServletResponse.sendRedirect 方法的相对URL以“/”开头,它是相对于整个WEB站点的根目录;如果创建RequestDispatcher对象时指定的相对URL以“/”开头,它是相对于当前WEB应用程序的根目录。
l 调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;调用RequestDispatcher.forward 方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。
l HttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。
l RequestDispatcher.forward方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。
RequestDispatcher
l include方法:
• RequestDispatcher.include方法用于将RequestDispatcher对象封装的资源内容作为当前响应内容的一部分包含进来,从而实现可编程的服务器端包含功能。
• 被包含的Servlet程序不能改变响应消息的状态码和响应头,如果它里面存在这样的语句,这些语句的执行结果将被忽略。
package cn.itcast.request;
import java.io.IOException;
…………………………
//用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("hahahahh<br/>");
request.getRequestDispatcher("/public/foot.jsp").include(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
在WEB-INF目录新建一个文件public,在里面建立两个jsp(head.jsp和foot.jsp)
(在被包含的页面里不能出现那些全局架构标签)
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
head <br>
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
foot<br>
l 总结web工程中各类地址的写法
package cn.itcast.url;
import java.io.IOException;
…………………………...
//web工程中各类地址的写法
public class ServletDemo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1
request.getRequestDispatcher("/formm1.html").forward(request, response);
//2重定向
response.sendRedirect("/day06/form1.html");
//3
this.getServletContext().getRealPath("/form1.html");
//4
this.getServletContext().getRealPath("/public/foot.jsp");
//5
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
l 防盗链
package cn.itcast.request;
import java.io.IOException;
…………………………….
//防盗链(打开页面之后,先看广告,后看内容,就要是打广告的)
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.sendRedirect("/day06/index.jsp");
return;
}
String data = "凤姐日记";
response.getWriter().write(data);
}
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>
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
<a href="/day06/servlet/ResponseDemo6">bbbbb</a>
<br/>看广告<br/>
<a href="/day06/servlet/RequestDemo9">看凤姐</a>
</body>
</html>
相关文章推荐
- java web给手机端写接口HttpServletRequest ,HttpServletResponse
- JavaWeb -- 服务器传递给Servlet的对象 -- ServletConfig, ServletContext,Request, Response
- Java Web(二) Servlet中response、request乱码问题解决
- JAVAWEB开发之HttpServletResponse和HttpServletRequest详解(下)(各种乱码、验证码、重定向和转发)
- JavaWeb -- 服务器传递给Servlet的对象 -- ServletConfig, ServletContext,Request, Response
- javaWeb_Request_Response
- Java Web day(5)之Response 与Request详细介绍
- java web给手机端写接口HttpServletRequest ,HttpServletResponse
- JavaWeb-HttpServletResponse、HttpServletRequest
- java_web学习第四天(request和response的学习)
- java程序员第十一课 javaweb之request&response
- javaweb_day10(servlet&request&response)之乱码解决遍
- [Java拾遗四]JavaWeb基础之Servlet_Request&&Response
- JAVAWEB开发之HttpServletResponse和HttpServletRequest详解(上)(各种乱码、验证码、重定向和转发)
- java web笔记——request&response
- JavaWeb——JSP内置对象request,response,重定向与转发 学习总结
- [JavaWeb]Servlet,Request,Response知识点补充
- [Java拾遗四]JavaWeb基础之Servlet_Request&&Response
- 04_Javaweb之request和response
- javaweb之request_response