1、重定向

    HttpServletRequest接口提供的sendRedirect()方法用于生产302响应码和Location响应头,从而通知客户端去重新访问Location响应头中指定的URL。
Servlet01类:

package com.yyq.sendredirect;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* Created by gao on 16-4-14.
*/
public class Servlet01 extends HttpServlet{
//处理HTTP GET请求
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
//处理HTTP POST请求
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//重新定向到servlet02
resp.sendRedirect("s02");
}
@Override
public void destroy() {
//空
}
@Override
public void init() throws ServletException {
//空
}
}

Servlet02类:

package com.yyq.sendredirect;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* Created by gao on 16-4-14.
*/
public class Servlet02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
out.println("<html>");
out.println("<head><title>Servlet06</head></title>");
out.println("<body>");
out.print("在Servlet02中获取请求参数name的值");
out.print(req.getParameter("name"));
out.println("</body>");
out.println("</html>");
}
@Override
public void destroy() {
//空
}
@Override
public void init() throws ServletException {
//空
}
}

web.xml注册:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0"> <servlet>
<servlet-name>servlet01</servlet-name>
<servlet-class>com.yyq.sendredirect.Servlet01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet01</servlet-name>
<url-pattern>/s01</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>servlet02</servlet-name>
<servlet-class>com.yyq.sendredirect.Servlet02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet02</servlet-name>
<url-pattern>/s02</url-pattern>
</servlet-mapping>
</web-app>

启动运行:http://localhost:8080/s01?name=test

  浏览器的地址栏的URL已经被自动修改成s02了,而且在Servlet02类中获取请求参数name的值为null,这表明无法获取初始请求中的参数数据了。
 
2、请求分派
    Servlet API中定义了一个RequestDispatcher接口,俗称请求分派器,有两个方法:forward()方法和include()方法。forward()方法用于将请求转发到RequestDispatcher实例封装的资源;include()方法用于将RequestDispatcher实例封装的资源作为当前响应内容的一部分包含进来。
Servlet03类:

package com.yyq.requestdispatcher;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* Created by gao on 16-4-14.
*/
public class Servlet03 extends HttpServlet {
//处理HTTP GET请求
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
//处理HTTP POST请求
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求分派器
RequestDispatcher dispatcher = req.getRequestDispatcher("servlet04");
//将请求转发至指定路径的资源
dispatcher.forward(req,resp);
}
@Override
public void destroy() {
//空
}
@Override
public void init() throws ServletException {
//空
}
}

Servlet04类:

package com.yyq.requestdispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* Created by gao on 16-4-14.
*/
public class Servlet04 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
out.println("<html>");
out.println("<head><title>Servlet06</head></title>");
out.println("<body>");
out.print("在Servlet03中获取请求参数name的值");
out.print(req.getParameter("name"));
out.println("</body>");
out.println("</html>");
}
@Override
public void destroy() {
//空
}
@Override
public void init() throws ServletException {
//空
}
}

web.xml注册:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<servlet>
<servlet-name>servlet03</servlet-name>
<servlet-class>com.yyq.requestdispatcher.Servlet03</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet03</servlet-name>
<url-pattern>/servlet03</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>servlet04</servlet-name>
<servlet-class>com.yyq.requestdispatcher.Servlet04</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet04</servlet-name>
<url-pattern>/servlet04</url-pattern>
</servlet-mapping>
</web-app>

启动Tomcat,输入:http://localhost:8080/servlet03?name=test

 
  浏览器地址栏的URL不变,但是服务器却是用Servlet04来响应的,在Servlet04中也可以获取客户端请求Servlet03时发送的参数数据。
 
3、重定向和请求分派的比较
    虽然HttpServletResponse的sendRedirect()方法和RequestDispatcher的forward()方法都可以让浏览器获得另一个URL所指向的资源所作出的响应,但两者的内部运行机制有着很大的区别。
    1)请求分派只能将请求转发给同一个Web应用中的其他组件;而重定向不仅可以定向到当前应用程序中的其他资源,也可以重定向到其他站点的资源上。
    2)重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;而请求转发过程结束后,浏览器地址保持初始的URL地址不变。
    3)请求分派的发起者和被调用者之间共享相同的request实例和response实例,它们属于同一个“请求/响应”过程;而重定向的发起者和被调用者使用各自的request实例和response,它们各自属于独立的“请求/响应”过程。
 
4、利用请求域属性传递对象数据
    HttpServletRequest接口中提供了几个方法,用来操作请求实例中存储的对象。
  • setAttribute(String name,Object o)方法:将数据作为request对象的一个属性存放到request对象中,例如:request.setAttribute("data", data);
  • getAttribute(String name)方法:获取request对象的name属性的属性值,例如:request.getAttribute("data")
  • removeAttribute(String name)方法:移除request对象的name属性,例如:request.removeAttribute("data")
  • Enumeration getAttributeNames()方法,获取request对象的所有属性名,返回的是一个Enumeration 对象,例如:Enumeration<String> attrNames = request.getAttributeNames();
    这种存储在HttpServlet中的对象称为请求域属性,属于同一请求过程的多个处理模块之间可以通过请求域属性来传递对象数据,如通过请求转发的两个Servlet之间就可以通过请求域属性来传递对象数据,但通过重定向的两个Servlet之间就不能通过请求域来传递对象数据。
    Servlet05类:

    package com.yyq.attributerequest;
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    /**
    * Created by gao on 16-4-14.
    */
    public class Servlet05 extends HttpServlet {
    //处理HTTP GET请求
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    doPost(req, resp);
    }
    //处理HTTP POST请求
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String str = "在Servlet05中存放请求域属性";
    req.setAttribute("content",str);
    //获取请求分派器
    RequestDispatcher dispatcher = req.getRequestDispatcher("servlet06");
    //将请求转发至指定路径的资源
    dispatcher.forward(req,resp);
    }
    @Override
    public void destroy() {
    //空
    }
    @Override
    public void init() throws ServletException {
    //空
    }
    }

    Servlet06类:

    package com.yyq.attributerequest;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    /**
    * Created by gao on 16-4-14.
    */
    public class Servlet06 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    doPost(req, resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    resp.setContentType("text/html;charset=utf-8");
    PrintWriter out = resp.getWriter();
    out.println("<html>");
    out.println("<head><title>Servlet06</head></title>");
    out.println("<body>");
    String str = (String) req.getAttribute("content");
    out.print("从Servlet05中获取请求域属性content的值为:" + str);
    out.println("</body>");
    out.println("</html>");
    }
    @Override
    public void destroy() {
    //空
    }
    @Override
    public void init() throws ServletException {
    //空
    }
    }
    web.xml注册:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">
    <servlet>
    <servlet-name>servlet05</servlet-name>
    <servlet-class>com.yyq.attributerequest.Servlet05</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>servlet05</servlet-name>
    <url-pattern>/servlet05</url-pattern>
    </servlet-mapping>
    <servlet>
    <servlet-name>servlet06</servlet-name>
    <servlet-class>com.yyq.attributerequest.Servlet06</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>servlet06</servlet-name>
    <url-pattern>/servlet06</url-pattern>
    </servlet-mapping>
    </web-app>

    启动Tomcat,输入:http://localhost:8080/servlet05

5、ServletConfig和ServletContext
    1)ServletConfig
    在web容器初始化Servlet实例时,都会为这个Servlet准备一个唯一的ServletConfig实例(俗称Servlet配置对象),Web容器会从部署描述文件中“读出”该Servlet类的初始化参数,并设置到ServletConfig实例中,然后再把这个ServletConfig实例传递给该Servlet实例的init()方法。
    a、给Servlet类配置初始化参数
        通过在web.xml文件中声明Servlet时添加<init-param>元素来配置。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<servlet>
<servlet-name>initparamservlet</servlet-name>
<servlet-class>com.yyq.initparam.InitParamServlet</servlet-class>
<!--定义一个Servlet初始化参数-->
<init-param>
<!--参数名-->
<param-name>encoding</param-name>
<!--参数值-->
<param-value>utf-8</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>initparamservlet</servlet-name>
<url-pattern>/initparamservlet</url-pattern>
</servlet-mapping>
</web-app>
  b、在Servlet类中获取它的初始化参数值
        一个Servlet类的实例初始化完毕之后,Web容器已经为它准备好了ServletConfig实例,在这个Servlet类中只需使用getServletConfig()方法就可以获取到这个实例。而ServletConfig接口中提供了getInitParameter(String name)方法来获取指定名称的初始化参数的字符串值。

package com.yyq.initparam;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* Created by gao on 16-4-14.
*/
public class InitParamServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取ServletConfig实例
ServletConfig config = this.getServletConfig();
//获取指定名称的初始化参数的字符串值
String str = config.getInitParameter("encoding");
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
out.println("<html>");
out.println("<head><title>initparamservlet</head></title>");
out.println("<body>");
out.print("获取InitParamServlet的初始化参数\"encoding\"的字符串值为:" + str);
out.println("</body>");
out.println("</html>");
}
@Override
public void destroy() {
super.destroy();
}
@Override
public void init() throws ServletException {
super.init();
}
}

Servlet的初始化参数只是针对当前这个Servlet类有效,在本Servlet类中只能获取自身的初始化参数,无法获取其他Servlet类的初始化参数。

    c、启动Tomcat
 
   2)ServletContext
    如果在多个Servlet类要获取相同的初始化参数,就可以把参数配置成Web应用上下文初始化参数。Web容器部署某个Web应用程序后,会为每个Web应用程序创建一个ServletContext实例(俗称Web应用上下文对象)。通过这个ServletContext实例就可以获取到所有的Web应用上下文初始化参数的值。
    ServletContext可以被认为是对于Web应用程序的一个整体性存储区域。每一个Web应用程序都只有一个ServletContext实例,存储在ServletContext之中的对象间一直被保留,直到它被删除。
    a、配置web应用上下文初始化参数
     通过在web.xml文件中添加<context-param>元素来配置。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<servlet>
<servlet-name>servletcontextservlet</servlet-name>
<servlet-class>com.yyq.servletcontext.ServletContextServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servletcontextservlet</servlet-name>
<url-pattern>/servletcontextservlet</url-pattern>
</servlet-mapping>
<!--定义一个Web应用上下文初始化参数-->
<context-param>
<!--参数名-->
<param-name>appName</param-name>
<!--参数值-->
<param-value>Servlet入门基础</param-value>
</context-param>
</web-app>

b、在Servlet类中获取Web应用上下文的初始化参数值

        Web容器也为每个Web应用程序准备好了一个ServletContext实例,在这个实例中保存着本Web应用中的所有应用上下文初始化参数。在Servelt类中都可以使用getServletContext()方法来获取本应用的ServletContext实例,通过ServletContext接口提供的getInitParameter(String name)方法就可以获取指定名称的Web应用上下文初始化采纳数的值。
package com.yyq.servletcontext;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* Created by gao on 16-4-14.
*/
public class ServletContextServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取ServletContext实例
ServletContext context = this.getServletContext();
//获取指定名称的web应用上下文初始参数的字符串值
String str = context.getInitParameter("appName");
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
out.println("<html>");
out.println("<head><title>servletcontextservlet</head></title>");
out.println("<body>");
out.print("获取ServletContext的初始化参数\"appName\"的字符串值为:" + str);
out.println("</body>");
out.println("</html>");
}
@Override
public void destroy() {
super.destroy();
}
@Override
public void init() throws ServletException {
super.init();
}
}

c、启动Tomcat

 
 
 
 
 
 

Servlet的应用的更多相关文章

  1. servlet文件下载

    创建web工程servlet,新建DownloadServlet.java package com.xmyself.servlet; import java.io.File; import java. ...

  2. java中servlet的各种路径

    1. web.xml中<url-pattern>路径,(叫它Servlet路径!) > 要么以“*”开关,要么为“/”开头 2. 转发和包含路径 > *****以“/”开头:相 ...

  3. Servlet监听器笔记总结

    监听器Listener的概念 监听器的概念很好理解,顾名思义,就是监视目标动作或状态的变化,目标一旦状态发生变化或者有动作,则立马做出反应. Servlet中的也有实现监听器的机制,就是Listene ...

  4. JavaWeb——Servlet

    一.基本概念 Servlet是运行在Web服务器上的小程序,通过http协议和客户端进行交互. 这里的客户端一般为浏览器,发送http请求(request)给服务器(如Tomcat).服务器接收到请求 ...

  5. servlet 简介,待完善

    什么是Servlet?① Servlet就是JAVA 类② Servlet是一个继承HttpServlet类的类③ 这个在服务器端运行,用以处理客户端的请求 Servlet相关包的介绍--javax. ...

  6. java web学习总结(五) -------------------servlet开发(一)

    一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...

  7. servlet使用入门

    创建web工程servlet,然后新建TestServlet.java package com.xmyself.servlet; import java.io.IOException; import ...

  8. 基于jsp+servlet图书管理系统之后台万能模板

    前奏: 刚开始接触博客园写博客,就是写写平时学的基础知识,慢慢发现大神写的博客思路很清晰,知识很丰富,非常又价值,反思自己写的,顿时感觉非常low,有相当长一段时间没有分享自己的知识.于是静下心来钻研 ...

  9. [Servlet] 初识Servlet

    什么是Servlet? 定义 Servlet的全称是 Server Applet,顾名思义,就是用 Java 编写的服务器端程序. Servlet 是一个 Java Web开发标准,狭义的Servle ...

  10. Java Servlet+Objective-c图上传 步骤详细

    一. Servlet 1.创建图片保存的路径 在项目的WebContent下创建一个上传图片的专属文件夹. 这个文件夹创建后,我们保存的图片就在该文件夹的真实路径下,但是在项目中是无法看到上传的图片的 ...

随机推荐

  1. Operating Cisco Router

    Operating Cisco Router consider the hardware on the ends of the serial link, in particular where the ...

  2. 从零开始学ios开发(七):Delegate,Action Sheet, Alert

    Action Sheet和Alert是2种特殊的控件(暂且称之为控件吧,其实不是控件真正的控件,而是ios中的2个类,这2个类定义了2种不同类型的用于和用户交互的弹出框),Action Sheet是从 ...

  3. LintCode-Search 2D Matrix II

    Write an efficient algorithm that searches for a value in an m x n matrix, return the occurrence of ...

  4. 常用的机器学习&数据挖掘知识点【转】

    转自: [基础]常用的机器学习&数据挖掘知识点 Basis(基础): MSE(Mean Square Error 均方误差),LMS(LeastMean Square 最小均方),LSM(Le ...

  5. description 数组的中文打印

    打印一个对象:NSLog(@"%@", stu); 默认情况下打印的时对象的名字和内存地址:这时需要重写description方法 // 重写description方法 - (NS ...

  6. Discuz!NT3.6与网站整合(操作用户信息)解决方案

    因为网站要加个论坛,所以就用到了Discuz!NT3.6. 可惜目前官方论坛已经关闭,只有3.6版本的有源码,3.9的没有源码,不好操作,下载地址: http://download.comsenz.c ...

  7. 开源 P2P 直播 视频会议

    转自:http://blog.csdn.net/pkueecser/article/details/8223074 一个P2P点播直播开源项目:P2PCenter(我转过来的时候发现已经都打不开了.. ...

  8. 【BZOJ】【2179】FFT快速傅里叶

    FFT 做的第二道用到FFT的……好吧其实还是模板题-_-b 百度上说好像分治也能做……不过像FFT这种敲模板的还是省事=.= /*********************************** ...

  9. Consumer Client Re-Design (翻译)

    注:0.9版本Kafka的一个重大改变就是consumer和producer API的重新设计. 这篇Kafka的文档大致介绍了对于consumer API重新设计时想要实现的功能.0.9版本的确实现 ...

  10. Unity3D脚本中文系列教程(十五)

    http://dong2008hong.blog.163.com/blog/static/4696882720140322449780/ Unity3D脚本中文系列教程(十四) ◆ LightRend ...