Java Web

来源:互联网 发布:湖州淘宝拍摄 编辑:程序博客网 时间:2024/05/17 23:46

转载自:http://blog.csdn.net/jiangzaifu/article/details/7694481

JSP 页面传值 I


 使用GET方式传值

a) 其值会直接显示在客户端(如浏览器地址栏) 如index.jsp页面中有如下代码

<a href="yinyu.jsp?Goto=yinyu_office">跳转并传值到yinyu.jsp页面</a>
代码中"?"号后的Goto为值的自定义命名,yinyu_office做为值传给yinyu.jsp页面

b) 接收值:在yinyu.jsp页面中使用以下代码得到值

String str = request.getParameter("Goto");
定义一个String字符型变量str用来接受index.jsp中Goto所传的值



 使用POST方式传值

a) 值通常用于表单形式,值为客户端不可见,如index.jsp页面中有如下代码

<form name="form1" action="yinyu.jsp" method="post">用户名:<input type="text" name="username" value=""><br>密码:<input type="text" name="password" value=""><br><input type="submit" value="提交"><input type="reset" value="重置"></form>
b) 接收值:在yinyu.jsp页面中使用以下代码得到值
String userName = request.getParameter("username");String password = request.getParameter("password");
定义两个String字符型变量userName,password用来接受index.jsp中表单所传送来的值,getParameter("username")括号中的字符必须与表单中name所定义的值相同。



 多个JSP页面之间传递参数

怎么在多个JSP页面之间进行参数传递?
需要使用JSP的内置作用域对象session.利用它的两个方法setAttribute(),getAttribute()
下面的这个实例实现了把第一个JSP页面的参数传递给第三个页面的功能,代码如下:

a) one.jsp

<html><form method="get" action="two.jsp">what's your name:<input type="text" name="username"><input type="submit" value="submit"></form></html>
b) two.jsp
<html><form method="post" action="three.jsp?pass=123456"><%String name=request.getParameter("username");//将name值绑定到session中session.setAttribute("username",name);%>Your name is:<%=request.getParameter("username")%><br>what's your hobby<br><input type="text" name="hobby"><input type="submit" value="submit"></form></html>
c) three.jsp
<html>your name is:<%=session.getAttribute("username")%><br>your hobby is:<%=request.getParameter("hobby")%><br>your password is:<%=request.getParameter("pass")%><br></form></html>

在three.jsp中通过session.getAttribute("username")得到绑定在session中的值

 JSP 页面传值 II
 使用session会话传值并重定向页面
//得到用户提交的值String name = request.getParameter("username");String pwd = request.getParameter("password");//创建HttpSessio对象HttpSession s = request.getSession();//将值绑定在session会话中s.setAttribute("Sname",name);s.setAttribute("Spwd",pwd);//重定向response.sendRedirect("yinyu.jsp");
在yinyu.jsp页面中得到值
//使用session会话取值String username = (String)session.getAttribute("Sname");String password = (String)session.getAttribute("Spwd");

 使用request方式传值并重定向页面
//得到用户提交的值String name = request.getParameter("username");String pwd = request.getParameter("password");//将值绑定在request中request.setAttribute("Rname",name);request.setAttribute("Rpwd",pwd);//重定向RequestDispatcher rd = request.getRequestDispatcher("yinyu.jsp");rd.forward(request,response);
在yinyu.jsp页面中得到值
//使用request协助相关取值String username = (String)request.getAttribute("Rname");String password = (String)request.getAttribute("Rpwd");

setAttribute()设置绑定属性值setAttribute("自定义命名",要绑定的引用);getAttribute()取出得到属性值getAttribute("setAttribute中的自定义命名");sendRedirect()重定向跳转页面sendRedirect("要跳转的页面地址");

基本的javaBean示例
public class infoBean {private int Uid;private String Uname;private String Usex;private int Uage;public infoBean() {}public void setUid(int _Uid){Uid = _Uid;}public int getUid(){return Uid;}public void setUname(String _Uname){Uname = _Uname;}public String getUname(){return Uname;}public void setUsex(String _Usex){Usex = _Usex;}public String getUsex(){return Usex;}public void setUage(int _Uage){Uage = _Uage;}public int getUage(){return Uage;}}
<span class="title">JSP中使用JavaBean</span> <hr width="100%" color="#990000" size="3" />1. 该实例主要告诉我们怎么样在JSP代码中调用JavaBean构件2. 使用JavaBean的优点是简化了JSP代码,界面代码和逻辑代码互相分离,便于程序员查看和调试3. 该实例需要五个文件:login.jsp、test.jsp、userbean.class4. 首先看一下login.jsp <pre class="codefont" name="code" style="white-space: pre-wrap; word-wrap: break-word;"><html><center><form method=post action="http://127.0.0.1:8000/test.jsp">username<input type="text" name="username"><p>password<input type="password" name="password"><p><input type="submit" value="注册"></form></center></html>

5. test.jsp代码如下:
<html><jsp:useBean id="hello" class="userbean" scope="session" /><jsp:setProperty name="hello" property="*" />your username is:<jsp:getProperty name="hello" property="username"/><p>your password is:<jsp:getProperty name="hello" property="password"/><p><%out.println(hello.insert());%></html>

6. JavaBean构件userbean.java代码如下:
import java.sql.*;public class userbean{private String username;private String password;public void setUsername(String username){this.username = username;}public String getUsername(){return username;}public void setPassword(String password){this.password = password;}public String getPassword(){return password;}public String insert(){try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");Connection dbcon = DriverManager.getConnection("jdbc:odbc:test","sa","");PreparedStatement stat = dbcon.prepareStatement("insert login values(?,?)");stat.setString(1,username);stat.setString(2,password);stat.executeUpdate();return "success";}catch(Exception e){System.out.println(e);return e.toString();}}}

7. 配置方法如下:
login,test放在j2ee的public_html中,userbean.class放在j2ee\lib\classes中
<span class="title">Include动作与Include指令的区别对比</span> <hr width="100%" color="#990000" size="3" /><table cellspacing="0" cellpadding="3" width="100%" border="1"><tbody><tr><th align="left" width="120" bgcolor="#eeeeee"> </th><th align="left" width="286" bgcolor="#eeeeee">include 动作</th><th align="left" width="298" bgcolor="#eeeeee">include 指令</th></tr><tr><td>语法</td><td class="tagfont"><jsp:include page="..."></td><td class="tagfont"><%@ include file="..."%></td></tr><tr><td>包含动作的发生时间</td><td>请求期间</td><td>页面转换期间</td></tr><tr><td>包含的内容</td><td>页面的输出</td><td>文件的实际内容</td></tr><tr><td>产生多少个 servlet</td><td>两个 ( 主页面和次级页面都会成为独立的 servlet )</td><td>一个 ( 次级页面首先被插入到主页面中,然后得到的页面被转换成 servlet )</td></tr><tr><td>被包含的页面中可否设置影响主页面的响应报头</td><td>不可以</td><td>可以</td></tr><tr><td>被包含的页面中可否定义主页面使用的字段或方法</td><td>不可以</td><td>可以</td></tr><tr><td>被包含的页面发生更改时是否需要更新主页面</td><td>不需要</td><td>需要</td></tr><tr><td>等同的 servlet 代码</td><td><span class="tagfont">RequestDispatcher</span> 的 include 方法</td><td>没有</td></tr></tbody></table><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"> <strong>include动作与inclue指令优缺点</strong> </p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;">include动作 <span class="tagfont"><jsp:include page="" /></span> 它允许我们在请求期间将其他页面的输出包含进来 </p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;">优点:在被包含的页面作出更改时,无须对主页面作出更改。缺点:它所包含的是次页面的输出,而非次页面的实际代码。 </p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;">所以在被包含的次级页面中不能使用任何有可能总体上影响主页面的jsp构造。它的优点远远胜过它的缺点,这几乎注定它会比其他包含机制应用的更为普遍。 </p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;">include指令 <span class="tagfont"><%@ include file="" %></span> 它可以在主页面转换成servlet之前,将jsp代码插入其中。 </p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;">优点:功能强大,所包含的代码可以含有总体上影响主页面的jsp构造,例如字段的定义和内容类型的设定。缺点:难以维护,只要被包含的页面发生更改就要更新主页面。</p><hr width="100%" size="1" /> <strong>使用include动作还是include指令?</strong> <p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;">使用include指令,如果被包含的文件发生改变,那么,用到它的所有Jsp页面都需要更新。仅当include动作不能满足要求时,我们才应该使用include指令。 </p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;">有些开发人员认为include指令生成的代码执行起来比使用include动作的代码更快。尽管原则上由可能的确如此,但性能上的差异很小,以致难以测量,同时,include动作在维护上的优势十分巨大,当两种方法都可以使用时,include动作几乎肯定是首选的方法。 </p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;">对于文件包含,应该尽可能地使用include动作。仅在所包含的文件中定义了主页面要用到的字段或方法,或所包含的文件设置了主页面的响应报头时,才应该使用include指令。 </p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;">既然include指令产生难以维护的代码,为什么人们还要使用它呢?因为include指令更为强大。include指令允许所包含的文件中含有影响主页面的Jsp代码,比如响应报头的设置和字段、方法的定义。 </p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;">例如: </p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;">subpage.jsp </p><pre class="codefont" name="code" style="white-space: pre-wrap; word-wrap: break-word;"><%! int num=0; %>
mainpage.jsp
<html><body><%@ include file="subpage.jsp" %><%= num %></body></html>
当然使用include动作时这是不可能的,因为num变量未定义,主页面不能成功的转换成servlet。

JSP/Servlet重定向
 RequestDispatcher.forward()

是在服务器端起作用,当使用forward()时,Servlet engine传递HTTP请求从当前的Servlet or JSP到另外一个Servlet,JSP 或普通HTML文件,也即你的form提交至a.jsp,在a.jsp用到了forward()重定向至b.jsp,此时form提交的所有信息在b.jsp都可以获得,参数自动传递.但forward()无法重定向至有frame的jsp文件,可以重定向至有frame的html文件,同时forward()无法在后面带参数传递,比如servlet?name=frank,这样不行,可以程序内通过response.setAttribute("name",name)来传至下一个页面.

重定向后浏览器地址栏URL不变.

例:在servlet中进行重定向
public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{response.setContentType("text/html; charset=gb2312");ServletContext sc = getServletContext();RequestDispatcher rd = null;rd = sc.getRequestDispatcher("/index.jsp"); //定向的页面rd.forward(request, response);}
通常在servlet中使用,不在jsp中使用。


 response.sendRedirect()

是在用户的浏览器端工作,sendRedirect()可以带参数传递,比如servlet?name=frank传至下个页面,同时它可以重定向至不同的主机上,sendRedirect()可以重定向有frame.的jsp文件.

重定向后在浏览器地址栏上会出现重定向页面的URL

例:在servlet中重定向

public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{response.setContentType("text/html; charset=gb2312");response.sendRedirect("/index.jsp");}
由于response是jsp页面中的隐含对象,故在jsp页面中可以用response.sendRedirect()直接实现重定位。

注意:
(1).使用response.sendRedirect()时,前面不能有HTML输出
这并不是绝对的,不能有HTML输出其实是指不能有HTML被送到了浏览器。事实上现在的Server都有Cache机制,一般在8K(我是说JSP Server),这就意味着,除非你关闭了cache,或者你使用了out.flush()强制刷新,那么在使用sendRedirect()之前,有少量的HTML输出也是允许的。

(2).response.sendRedirect()之后,应该紧跟一句return;

我们已经知道response.sendRedirect()是通过浏览器来做转向的,所以只有在页面处理完成后,才会有实际的动作。既然你已经要做转向了,那么后的输出还有什么意义呢?而且有可能会因为后面的输出导致转向失败。

比较:
(1).RequestDispatcher.forward()是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;

(2).response.sendRedirect()则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。

前者更加高效,在前者可以满足需要时,尽量使用RequestDispatcher.forward()方法.

注:在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用HttpServletResponse.sendRequest()方法。


 <jsp:forward page="" />

它的底层部分是由RequestDispatcher来实现的,因此它带有RequestDispatcher.forward()方法的印记。

如果在<jsp:forward>之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么该语句将不起作用,这一点应该特别注意。

另外要注意:它不能改变浏览器地址,刷新的话会导致重复提交


 修改HTTP header的Location属性来重定向

通过设置直接修改地址栏来实现页面的重定向。

jsp文件代码如下:

<%response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);String newLocn = "/newpath/jsa.jsp";response.setHeader("Location",newLocn);%>

 JSP中实现在某页面停留若干秒后,自动重定向到另一页面

在html文件中,下面的代码:

<meta http-equiv="refresh" content="300; url=target.jsp">
它的含义:在5分钟之后正在浏览的页面将会自动变为target.html这一页。代码中300为刷新的延迟时间,以秒为单位。targer.html为你想转向的目标页,若为本页则为自动刷新本页。

由上可知,可以通过setHeader()来实现某页面停留若干秒后,自动重定向到另一页面。

关键代码:

String content=stayTime+";URL="+URL;response.setHeader("refresh",content); 

JDBC-ODBC翻页示例
 一、运行前准备

建一个MS SQLServer数据库DNS,名称为Test_DB
数据库中有一个表:guestbook字段为:name(varchar)email(varchar)body(text)
数据库用户为sa、密码空,可以自己修改的。

 二、代码

<%@ page contentType="text/html;charset=gb2312"%><%//变量声明java.sql.Connection sqlCon; //数据库连接对象java.sql.Statement sqlStmt; //SQL语句对象java.sql.ResultSet sqlRst; //结果集对象java.lang.String strCon; //数据库连接字符串java.lang.String strSQL;   //SQL语句int intPageSize; //一页显示的记录数int intRowCount; //记录总数int intPageCount; //总页数int intPage; //待显示页码java.lang.String strPage;int i,j,k; //设置一页显示的记录数intPageSize = 5; //取得待显示页码strPage = request.getParameter("page");if(strPage == null){ //表明在QueryString中没有page这一个参数,此时显示第一页数据intPage = 1;} else{ //将字符串转换成整型intPage = java.lang.Integer.parseInt(strPage);if(intPage<1)intPage = 1;}Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //装载JDBC-ODBC驱动程序strCon = "jdbc:odbc:Test_DB";//设置数据库连接字符串sqlCon = java.sql.DriverManager.getConnection(strCon,"sa",""); //连接数据库sqlStmt = sqlCon.createStatement(); //创建SQL语句对象strSQL = "select count(*) from guestbook"; //获取记录总数sqlRst = sqlStmt.executeQuery(strSQL); //执行SQL语句并取得结果集sqlRst.next(); //记录集刚打开的时候,指针位于第一条记录之前intRowCount = sqlRst.getInt(1);sqlRst.close(); //关闭结果集intPageCount = (intRowCount+intPageSize-1) / intPageSize;//记算总页数if(intPage > intPageCount)//调整待显示的页码intPage = intPageCount;strSQL = "select name,email,body from guestbook"; //设置获取数据SQL语句sqlRst = sqlStmt.executeQuery(strSQL); //执行SQL语句并取得结果集//将记录指针定位到待显示页的第一条记录上i = (intPage-1) * intPageSize;for(j=0;j<i;j++) sqlRst.next();%><html><head></head><body><p align=center>jdbc-odbc留言版</p><table border="1" cellspacing="0" cellpadding="0" width="600" align="center"><%//显示数据i = 0;while(i < intPageSize && sqlRst.next()){%><tr><td>姓名:<%=sqlRst.getString(1)%></td><td>邮件:<%=sqlRst.getString(2)%></td></tr><tr><td colspan=2><%=sqlRst.getString(3)%></td></tr><% i++;} %><tr><td colspan=2 align=center>第<%=intPage%>页 / 共<%=intPageCount%>页<%if(intPage<intPageCount){%><a href="mssql.jsp?page=<%=intPage+1%>">下一页</a><%}if(intPage>1){%><a href="mssql.jsp?page=<%=intPage-1%>">上一页</a><%}%></td></tr></table></body></html><%sqlRst.close(); //关闭结果集sqlStmt.close(); //关闭SQL语句对象sqlCon.close();//关闭数据库%>
 三、运行

将代码保存为文件test.jsp
Orion Application Server下:
Copy到orion的default-web-app目录下,通过:http://localhost:8080/test.jsp访问测试
对于Resin,Tomcat,JWS等等,都可以运行通过。

  
<span class="title">使用jar包连接SQL并分页</span> <hr width="100%" color="#990000" size="3" /> 在使用jar包连接时先将<span class="Stress">msbase.jar</span>、<span class="Stress">mssqlserver.jar</span>、<span class="Stress">msutil.jar</span>三个包导入工程 <pre class="codefont" name="code" style="white-space: pre-wrap; word-wrap: break-word;">// sql为必须导入的包import java.sql.*;public class dataBean {// 创建所需要的私有成员private Connection conn;private String url;private String name;private String pwd;private Statement stat;private ResultSet rs;private String sqlpublic dataBean() {this.linkData}public Connection linkData(){try{// 加载驱动Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");// 指定数据源,databaseName=后面跟数据源名url = "jdbc:microsoft:sqlserver://localhost:1433;databaseName=mydb";// name用于登陆数据库用户名name = "sa";// pwd用于登陆数据库用户密码pwd = "sa";// 建立连接conn = DriverManager.getConnection(url,name,pwd);// 创建SQL语句对象stat = conn.createStatement();if (conn != null){// 若数据连接成功则输出成功提示System.out.println("数据库连接成功!");}}catch(Exception e){e.printStackTrace();}return conn;}}

 使用数据库链接(以倒序查取数据为例)
public ArrayList getData(int _page) throws Exception {// 建一个ArrayList用于存储数据ArrayList alist = new ArrayList();// new出于分页的pageBeanpageBean pbean = new pageBean();pbean.setPage(pageSize * (_page - 1));sql = "select top " + pageSize + " * from messageTable where mid not in(select top " + pbean.getPage() + " mid from messageTable order by(mid)desc) order by(mid)desc";// 执行SQL语句rs = stat.executeQuery(sql);// 取出数据并绑在指定的Bean中while (rs.next()) {messageBean mbean = new messageBean();mbean.setMid(rs.getInt("mid"));mbean.setMportrait(rs.getString("mportrait"));mbean.setMname(rs.getString("mname"));mbean.setMsex(rs.getString("msex"));mbean.setMtime(rs.getString("mtime"));mbean.setMqq(rs.getString("mqq"));mbean.setMmail(rs.getString("mmail"));mbean.setMhome(rs.getString("mhome"));mbean.setMip(rs.getString("mip"));mbean.setMtext(rs.getString("mtext"));//将添加到ArrayList中alist.add(mbean);}// 返回Arraylistreturn alist;}
以上是以倒序查询数据并同时分页的实例,基中pageSize为每页将显示的记录条数,_page为传进来的页码
 在页面中显示数据
// 建一个ArrayList去调用dataBean.getData()方法,并传入相应的参数ArrayList list = (ArrayList)dataBean.getData(页码);// 使用迭代器对ArrayList进行遍历Iterator it = list.iterator();// 使用while循环取出数据while(it.hasNext()){messageBean mbean = (messageBean)it.next();mbean.getMid();mbean.getMportrait();mbean.getMname();mbean.getMsex();mbean.getMtime();mbean.getMqq();mbean.getMmail();mbean.getMhome();mbean.getMip();mbean.getMtext();}
<span class="title">javaWeb 状态代码</span> <hr width="100%" color="#990000" size="3" /><table cellspacing="0" cellpadding="3" width="100%" border="1"><tbody><tr><td class="bar_cn" width="15%" bgcolor="#cccccc">状态代码</td><td class="bar_cn" width="85%" bgcolor="#cccccc">描述</td></tr><tr><td class="Stress" align="middle">100 - 199</td><td>状态代码 100 - 199 间的值都是信息性的、标示客户应该采取的其他动作。</td></tr><tr><td class="Stress" align="middle">200 - 299</td><td>状态代码 200 - 299 间的值表示请求成功。</td></tr><tr><td class="Stress" align="middle">300 - 399</td><td>状态代码 300 - 399 间的值用于那些已经移走的文件、常常包括 Location 报头、指出新的地址。</td></tr><tr><td class="Stress" align="middle">400 - 499</td><td>状态代码 400 - 499 间的值表明是由客户引发的错误。</td></tr><tr><td class="Stress" align="middle">500 - 599</td><td>状态代码 500 - 599 间的代码表示由服务器引发的错误</td></tr><tr><td class="bar_cn" bgcolor="#cccccc" colspan="2">一些重要的状态代码说明</td></tr><tr><td class="Stress" align="middle" rowspan="2">100</td><td bgcolor="#eeeeee">Continue、继续</td></tr><tr><td>如果服务器接收到的值为 100-Continue 的 Expect 的请求报头、这表示客户程序在询问是否可以在随后的请求中发送附加文档。这种情况下、服务器应该说以状态 100(SC_Continue) 回应、告诉客户程序继续下去、或者使用状态代码417(SC_Expectation_Failed) 告诉浏览器它不接受该文档、这是 HTTP1.1 新引入的状态代码。</td></tr><tr><td class="Stress" align="middle" rowspan="2">200</td><td bgcolor="#eeeeee">OK、一切正常</td></tr><tr><td>状态代码 200(SC_OK) 表示一切正常;如果是 GET 和 POST 请求、则文档就跟在后面。对于 Serlvet、这是默认值;如果没有使用 setStatus、那么默认值就是 200。</td></tr><tr><td class="Stress" align="middle" rowspan="2">202</td><td bgcolor="#eeeeee">Accepted、已接受</td></tr><tr><td>状态代码 202(SC_Accepted) 告诉客户、请求已接受、但处理尚未完成。</td></tr><tr><td class="Stress" align="middle" rowspan="2">204</td><td bgcolor="#eeeeee">No Content、没有新文档</td></tr><tr><td>状态代码 204(SC_No_Content) 要求浏览器继续显示之前的文档、因为没有新的文档。如果用户周期性地单击 Reload 按钮来重新载入页面、那么这个行为就比较有用、您可以确定前面的页面已经是最新的。</td></tr><tr><td class="Stress" align="middle" rowspan="2">205</td><td bgcolor="#eeeeee">Reset Content、重置内容</td></tr><tr><td>状态代码 205(SC_Reset_Content) 表示没有新的文档、但浏览器应该重置文档视图。因此、这个状态代码用来指示浏览器清除表单的字段。它是 HTTP1.1 新引入的状态代码。</td></tr><tr><td class="Stress" align="middle" rowspan="2">301</td><td bgcolor="#eeeeee">Moved Permanently、被永久移动</td></tr><tr><td>状态代码 301(SC_Moved_Permanently) 状态表示所请求的文件已被移往别处;文档的新 URL 在 Location 响应报头中给出。浏览器应该依据这个链接跳转到新的 URL。</td></tr><tr><td class="Stress" align="middle" rowspan="2">302</td><td bgcolor="#eeeeee">Found、找到</td></tr><tr><td>状态代码 302 类似于 301,只是原则上应该将 Location 报头给出的 URL 看作是非永久性的临时替代。实践中、大多数浏览器都等同地对待 301 和 302、注意;在 HTTP1.0 中,该消息是 Moved Temporarily(被临时移动)、而非 Found;并且 HttpServletResponse 中对应的常量是 SC_Moved_Temporarily、而非预期的 SC_Found。</td></tr><tr><td class="Stress" align="middle" rowspan="2">303</td><td bgcolor="#eeeeee">See Other、检查其它文档</td></tr><tr><td>状态代码 303(SC_See_Other) 类似于 301 和 302、除非初始的请求为 POST、否则应该用 GET 来读取新的文档(d Location 报头中给出)。参见代码 307。这是 HTTP1.1 新引入的状态代码.</td></tr><tr><td class="Stress" align="middle" rowspan="2">304</td><td bgcolor="#eeeeee">Not Modified、未发生改变</td></tr><tr><td>在客户已经拥有缓存的文档时、它可以通过提供 IF-Modifred-Since 报头来执行条件请求、表示仅当文档在指定的日期之后发生改变时、才希望读取该文档。 304(SC_Not_Modified) 表示缓存的版本是最新的、客户程序应该使用它。否则服务器应该返回所请求的文档、并设置正常 (202) 状态代码。Servlet 一般不应该直接设置这个状态代码。它们应该实现 getLastModified 方法、由默认的 Service 方法基于这个修改日期处理条件请求。</td></tr><tr><td class="Stress" align="middle" rowspan="2">307</td><td bgcolor="#eeeeee">Temporary Redirect、临时重定向</td></tr><tr><td>浏览器对 307 状态的处理规则与 302 状态相同。之所以将值 307 引入到 HTTP1.1 中、是因为甚至在最初的消息是 POST 的情况下、许多浏览器依旧错误地跟随 302 响应中的重定向信息。浏览器应该只在接收到 303 响应状态时才跟从 POST 请求的重定向。引入这个新状态是为了去除二义性;如果接收到 303 响应、则继续进行 GET 和 POST 请求的重定向。如果接收到 307 响应、对于 GET 请求的重定向、则继续进行、但对于 POST 请求的重定向、则不再继续下去。这是 HTTP1.1 新引入的状态代码。</td></tr><tr><td class="Stress" align="middle" rowspan="2">400</td><td bgcolor="#eeeeee">Bad Request、错误请求</td></tr><tr><td>状态代码 404(SC_Bad_Request) 状态表明客户请示中含有语法错误。</td></tr><tr><td class="Stress" align="middle" rowspan="2">401</td><td bgcolor="#eeeeee">Unauthorized、未授权</td></tr><tr><td>状态代码 404(SC_Unauthorized) 表示客户程序试图访问密码保护的页面、但在请求的 Authorization 报头中没有正确的身份标识信息、响应必须包括 WWW-Authenticate 报头。</td></tr><tr><td class="Stress" align="middle" rowspan="2">403</td><td bgcolor="#eeeeee">Forbidden、资源不可用</td></tr><tr><td>状态代码 403(SC_Not_forbidden) 表示服各器拒绝提供相关的资源、不管是否拥有授权。这个状态常常是由服务器上的文件或目录的许可权限导致的结果。</td></tr><tr><td class="Stress" align="middle" rowspan="2">404</td><td bgcolor="#eeeeee">Not found、未找到</td></tr><tr><td>状态代码 404(SC_Not_Found) 状态告诉客户程序、在给定的地址找不到任何资源。这个值勤是标准的 "no such page" 响应。由于这个响应太过于常用和有效、因此在 HttpServletResponse 类中为它提供了一个专们的方法:sendError("message")。与 sendStatus 相比、sendStatus 的优点是:使用 sendError 时服务器会自动成生显示错误消息的错误页面。 404 错误不应该只是声明 "对不起、找不到您所需要的页面" 。相反、它们可以给出相关的信息、说明为什么找不到该页面、或者提供查找框、或其他可以供查看的位置。</td></tr><tr><td class="Stress" align="middle" rowspan="2">405</td><td bgcolor="#eeeeee">Method Not Allowed、方法不允许</td></tr><tr><td>状态代码 405(SC_Method_Not_Allowed) 值表示这个特定资源不允许使用该请求方法 (GET、POST、HEAD、PUT、DELETE) 等。这是 HTTP1.1 新引入的状态代码。</td></tr><tr><td class="Stress" align="middle" rowspan="2">415</td><td bgcolor="#eeeeee">Unsupported Media Type、不支持的媒体类型</td></tr><tr><td>状态代码 415(SC_Unsupported_Media_Type) 表明服务器不知道如何处理请求附加文件的类型。这是 HTTP1.1 新引入的状态代码。</td></tr><tr><td class="Stress" align="middle" rowspan="2">417</td><td bgcolor="#eeeeee">Expectation Failed、期望不能满足</td></tr><tr><td>如果服务器接收到值为 100-Continue 的 Expect 请求报头、则表示客户程序在询问是否可以在后续的请求中发送附加的文档、要么使用 100(SC_Continue) 告诉客户程序继续进行。这是 HTTP1.1 新引入的状态代码。</td></tr><tr><td class="Stress" align="middle" rowspan="2">500</td><td bgcolor="#eeeeee">Internal Server Error、服务器内部错误</td></tr><tr><td>状态代码 500(SC_Internal_Server_Error) 是通用的表示 "服务器陷入混乱" 的状态代码。它常常是由 CGI 程序或 Servlet 崩溃或返回格式不正确的报头而造成的。</td></tr><tr><td class="Stress" align="middle" rowspan="2">501</td><td bgcolor="#eeeeee">Not Implemented、未实现</td></tr><tr><td>状态代码 501(SC_Not_Implemented) 状态通知客户程序、服务器不支持能够满足该请求的功能。它用于表示服务器不支持客户程序以送的命令、比如 PUT。</td></tr><tr><td class="Stress" align="middle" rowspan="2">503</td><td bgcolor="#eeeeee">Service Unavailable、服务不可用</td></tr><tr><td>状态代码 503(SC_Service_Unavailable) 表示由于维护工作或超负荷工作、服务器不能做出响应。例如:如果线程池或数据库连接池当前被全部占用、那么 Servlet 可能就要返回这个报头。服务器可以提供 Retry-After 报头、告诉客户程序何时重试。</td></tr><tr><td class="Stress" align="middle" rowspan="2">505</td><td bgcolor="#eeeeee">HTTP Version Not Supported、不支持的 HTTP 版本</td></tr><tr><td>状态代码 505(SC_HTTP_Version_Not_Supported) 表示服务器不支持请求中给出的 HTPP 版本。这是 HTTP1.1 新引入的状态代码。</td></tr></tbody></table>

0 0
原创粉丝点击