标签:.com html5+ extends extend web.xml 用户 form html5 mit
1、先快速搭建一个简单的测试环境,以后的内容都将基于下面的这些代码,tomcat webapps:html5+web.xml+servlet
<!DOCTYPE html> <html> <body> <form action="MyTest.do" method="get"> Username:<br> <input type="text" name="username" value=""> <br> Password:<br> <input type="text" name="passwd" value=""> <br><br> <input type="submit" value="Submit"> </form> <p>this is simple test.</p> </body> </html>
<?xml version="1.0" encoding="ISO-8859-1" ?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <servlet> <servlet-name>MyTest</servlet-name> <servlet-class>com.example.web.MyTest</servlet-class> </servlet> <servlet-mapping> <servlet-name>MyTest</servlet-name> <url-pattern>/MyTest.do</url-pattern> </servlet-mapping> </web-app>
package com.example.web; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class MyTest extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { resp.setContentType("text/html"); PrintWriter out = resp.getWriter(); out.println("Hello World<br />"); } }
这个Servlet应该很好理解,就是点击submit后将跳出一个带有一行“Hello World”的页面。
响应首部(Response Headers)属于HTTP首部中的一种。
首先,需要理解的是:响应首部并不包括用户想看到的信息、“多媒体”页面,也就是说,对于普通网民,不需要知道这些信息。
那么,响应首部是干嘛的呢?主要是用于协助客户端和服务器的通信,例如,服务器要在响应首部中告知客户端返回的内容是html,还是jar、zip,这样浏览器才能做出正确的响应:展示页面or提供下载。
在响应首部中以Content-Type这个字段来表示报文主体的对象类型,可以做一个测试,如果修改servlet为:
package com.example.web; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class MyTest extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { resp.setContentType("text/html"); resp.setHeader("Content-Type", "application/jar"); // setHeader的效果:如果响应中已有同名的首部,则用这个值替换原来的值。否则,向响应首部添加一个新首部和值。 PrintWriter out = resp.getWriter(); out.println("Hello World<br />"); } }
修改之后,当我们在浏览器页面中点击submit的时候,得到的将不是一个Hello World的页面,而是直接下载MyTest.do这个文件,不过它的内容将是Hello World<br />。需要注意的是,如果你万一把Content-Type给打错了,那么setHeader并不会帮你指出错误,而是添加一个“错别字”首部!
继续修改servlet,把setHeader改为addHeader:
package com.example.web; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class MyTest extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { resp.setContentType("text/html"); resp.addHeader("Content-Type", "application/jar"); // addHeader的效果:向响应首部添加一个新首部和值,或者给现有的增加另一个值。 PrintWriter out = resp.getWriter(); out.println("Hello World<br />"); } }
很容易猜到运行结果:既提供下载又转到Hello World页面,然而这是错的,实际测试的结果是:只提供下载而不提供页面展示。
还有一个设置Header的方法为:setIntHeader,效果和setHeader类似,不过首部的值不再是String类型,而是int型。
其它设置Header的方法可以参看官方api,并不多。
5、把请求重定向到另外一个完全不同的URL,也就是把请求转发给另一个人来处理。可以使用形如下面的代码完成:
package com.example.web; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class MyTest extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { resp.sendRedirect("http://www.cnblogs.com/xkxf/"); } }
修改之后,当我们按下submit的时候,将会直接跳转至新的URL,(当然,在这里新跳转的URL并不处理请求)。
sendRedirect的用法不难理解,那么当resp.sendRedirect的时候,实质上发生了什么?
这个时候我们想,一定是改变了响应的首部,如果有一个方法可以直接查看HTTP报文就好了,那我们就可以确切的知道发生了什么。
在谷歌浏览器下,按F12进入开发者页面,可以通过这个方法,来观察上面代码对响应首部(Response Headers)的实际影响。如下所示(点击可查看大图):
点开Network,可以观察到一个名为Loction的首部,内容正好是我们重定向的URL,那么如果把Servlet代码改为“resp.setHeader("Location", "http://www.cnblogs.com/xkxf/");”可以实现重定向吗?答案是不可以,不过再补充一句“resp.setStatus(302);”倒是可以实现这个效果。
7、最后,sendRedirect("另一个URL")到底意味着什么呢?书上的解释是:希望浏览器用“另一个URL”处理请求,它的真正用法是:
if (worksForMe) { // some codes ... } else { resp.sendRedirect("Another URL"); }
“另一个URL”也可使用相对URL,需要区分的是
【Head First Servlets and JSP】笔记6:什么是响应首部
标签:.com html5+ extends extend web.xml 用户 form html5 mit
原文地址:http://www.cnblogs.com/xkxf/p/6928509.html