`

JAVA开发(4) - Servlet中的几个对象

阅读更多

Servlet中的几个对象:

HttpServletRequestHttpSessionServletContext,这三个对象都有

void setAttribute(String name,  Object o)void removeAttribute(String name)<?XML:NAMESPACE PREFIX = O ?>

这两个方法,通过这两个方法我们可以很方便的进行参数的传递。

三个对象的作用域的大小分别由小到大。当我们把一个对象通过void setAttribute(String name,  Object o)添加到这三个对象中的时候,除非我们显示的调用void removeAttribute(String name)或者当这三个对象自己销毁否则不会释放这些对象占用的空间,所以我们在将一个对象通过setAttribute添加到这三个对象时,需要注意用完了就remove(当然用完以后这个添加到的对象本身就快销毁时,我们也没必要多此一举)。而且尽量当对象存放在HttpServletRequest,然后才是HttpSession最后才是ServletContext。尽量不要把大对象存放在这些对象中,因为一个进程占用的资源毕竟是有限的。

 

 

Servlet中路径跳转的问题:

   

让我们先通过一个例子来看一下HttpServletRequest的获取路径的一些方法的返回值。

 

ServletPath:

 

package squall.servlet.path;

 

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 ServletPath extends HttpServlet

...{

 

       
protected void doGet(HttpServletRequest req, HttpServletResponse resp)

                     
throws ServletException, IOException

       
...{

              showParam(req,resp);

       }


 

       
protected void doPost(HttpServletRequest req, HttpServletResponse resp)

                     
throws ServletException, IOException

       
...{

              showParam(req,resp);

       }


       
private void showParam(HttpServletRequest req, HttpServletResponse resp) throws IOException

       
...{

              resp.setContentType(
"text/html");

              PrintWriter out 
= resp.getWriter();

              String docType 
= "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> ";

 

              

              out.println(docType 
+ "<HTML> " + "<HEAD><TITLE> pathshow" 

                            
+ "</TITLE></HEAD> " + "<BODY BGCOLOR="#FDF5E6"> "

                            
+"getContextPath():  " + req.getContextPath() + "   </br>"

                            
+"getPathInfo():        " + req.getPathInfo() + "   </br>"

                            
+"getRequestURI():   " + req.getRequestURI()+ "   </br>"

                            
+"getRequestURL():   " + req.getRequestURL()+ "   </br>"

                            
+"getServletPath():   " + req.getServletPath()+ "   </br>"

                            
+"getQueryString():  " + req.getQueryString()+ "   </br>"

                            );

 

          out.println(
"</body></html>");

       }


       

}


 

将此Servlet部署后,mapping<url-pattern>/ServletPath/*</url-pattern>

在浏览器输入http://127.0.0.1:8080/train/ServletPath/a/b/c?name=1&passord=2

可以看到如下输出:

getContextPath(): /train
     getPathInfo(): /a/b/c
     getRequestURI(): /train/ServletPath/a/b/c
     getRequestURL(): http://127.0.0.1:8080/train/ServletPath/a/b/c
     getServletPath(): /ServletPath
     getQueryString(): name=1&passord=2

 

我们可以很清楚的看到各个方法的返回值的情况。

 

     一个html,Servlet,jsp访问另外一个Servlet时候可以通过相对路径(相对于当前的路径),相对于同一Web应用下的路径(比如我们的/train,通过request.getContextPath()获得)和绝对路径(直接http://...)

 

我们一般在Servlet中访问另外一个Servlet或者jsp可以通过Servlet输出中的HTML元素FORM的属性值ACTION来实现。但是我们有时候可以采用一些更加方便的方法。

 

 

 

下面简单的介绍3个方法:

RequestDispatcher

     void forward(ServletRequest request, ServletResponse response)

     void include(ServletRequest request, ServletResponse response)方法。

 HttpResponsevoid sendRedirect(String location)方法。

 

 我们先来介绍HttpResponsevoid sendRedirect(String location)方法。

这个方法将请求一个urllocation的页面, location可以是一个相对路径、相对于当前WEB应用的路径或者直接Http开头的路径,下面让我们看一个例子吧。

BeforeSendRedirect

 

 

package squall.servlet.path;

 

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 BeforeSendRedirect extends HttpServlet

...{

 

       
protected void doGet(HttpServletRequest req, HttpServletResponse resp)

                     
throws ServletException, IOException

       
...{

              resp.setContentType(
"text/html");

              PrintWriter out 
= resp.getWriter();

              String docType 
= "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> ";

              req.setAttribute(
"canyousee""this");

              

              out.println(docType 
+ "<HTML> " + "<HEAD><TITLE> BeforeSendRedirect" 

                            
+ "</TITLE></HEAD> " + "<BODY BGCOLOR="#FDF5E6"> "

                            
+"     <h1>BeforeSendRedirect</h1>    </br>"

                            );

                 out.println(
"</body></html>"); 

              resp.sendRedirect(
"AfterSendRedirect");

       

         System.err.println(
"canyousee " + req.getAttribute("canyousee"+ " in BeforeSendRedirect");

         System.err.println(
"end in BeforeSendRedirect");

       }


 

       
protected void doPost(HttpServletRequest req, HttpServletResponse resp)

                     
throws ServletException, IOException

       
...{

              doGet(req,resp);

       }


       

}


 

 

AfterSendRedirect

 

package squall.servlet.path;

 

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 AfterSendRedirect extends HttpServlet

...{

       
protected void doGet(HttpServletRequest req, HttpServletResponse resp)

                     
throws ServletException, IOException

       
...{

              System.err.println(
"begin AfterSendRedirect!");

              resp.setContentType(
"text/html");

              PrintWriter out 
= resp.getWriter();

              String docType 
= "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> ";

              

              out.println(docType 
+ "<HTML> " + "<HEAD><TITLE> AfterSendRedirect"

                            
+ "</TITLE></HEAD> " + "<BODY BGCOLOR="#FDF5E6"> "

                            
+ "     <h1>AfterSendRedirect</h1>    </br>");

              out.println(
"</body></html>");

              System.err.println(
"canyousee " + req.getAttribute("canyousee"+ " in AfterSendRedirect");

       }


 

       
protected void doPost(HttpServletRequest req, HttpServletResponse resp)

                     
throws ServletException, IOException

       
...{

              doGet(req, resp);

       }


}


 

 

 

BeforeSendRedirect mapping<url-pattern>/BeforeSendRedirect</url-pattern>

BeforeSendRedirect mapping<url-pattern>/AfterSendRedirect</url-pattern>

然后我们访问http://127.0.0.1:8080/train/BeforeSendRedirect,可以看到页面跳转到http://127.0.0.1:8080/train/AfterSendRedirect,并且页面上显示的内容也是

AfterSendRedirect

并且tomcat控制台输出为:

canyousee this in BeforeSendRedirect

end in BeforeSendRedirect

begin AfterSendRedirect

canyousee null in AfterSendRedirect

 

可以看出使用HttpResponsevoid sendRedirect(String location)方法

1、             html页面会显示location所输出的页面

2、            浏览器上的url也为location的绝对路径

3、            servlet调用void sendRedirect(String location)方法后,剩下的代码也会执行

4、            servlet和跳转至的servletHttpServletRequest对象不是同一个对象。

 

下面该是

RequestDispatcher

     void forward(ServletRequest request, ServletResponse response)

     void include(ServletRequest request, ServletResponse response)方法的介绍。

       在这之前,我们先来看下javax.servlet.RequestDispatcher对象的获得方法。

获得这个对象的方法,存在于3个类或者接口中分别是ServletContextServletRequestServletRequestWrapper。这里我们只看ServletContextServletRequest

ServletContextServletRequest中获取RequestDispatcher都是通过方法RequestDispatcher getRequestDispatcher(String path),但是需要注意这个方法在用不同的类调用的时候存在一些差异,使用ServletContext接口的对象调用时,String path的参数必须以”/”开头,也就是说从这个web项目的根开始。而使用ServletRequest接口的对象调用这个方法时,path可以不以”/”开头,简单的说就是可以使用相对于当前请求的相对路径。

下面我们先来看RequestDispatchervoid forward(ServletRequest request, ServletResponse response)方法,按照惯例,我们还是用例子来说明问题。

 

BeforeForward

 

package squall.servlet.path;

 

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class BeforeForward extends HttpServlet

...{

       
protected void doGet(HttpServletRequest req, HttpServletResponse resp)

                     
throws ServletException, IOException

       
...{

              resp.setContentType(
"text/html");

              PrintWriter out 
= resp.getWriter();

              String docType 
= "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> ";

              req.setAttribute(
"canyousee""this");

 

              out.println(docType 
+ "<HTML> " + "<HEAD><TITLE> BeforeForward"

                            
+ "</TITLE></HEAD> " + "<BODY BGCOLOR="#FDF5E6"> "

                            
+ "     <h1>BeforeForward</h1>    </br>");

              out.println(
"</body></html>");

              RequestDispatcher rd 
= this.getServletContext().getRequestDispatcher("/AfterForward");

              System.err.println(
"canyousee " + req.getAttribute("canyousee")

                            
+ " in BeforeForward");

              rd.forward(req, resp);

 

              System.err.println(
"end in BeforeForward");

       }


 

       
protected void doPost(HttpServletRequest req, HttpServletResponse resp)

                     
throws ServletException, IOException

       
...{

              doGet(req, resp);

       }


}


 

 

AfterForward

 

package squall.servlet.path;

 

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 AfterForward extends HttpServlet

...{

       
protected void doGet(HttpServletRequest req, HttpServletResponse resp)

                     
throws ServletException, IOException

       
...{

              System.err.println(
"begin AfterForward!");

              resp.setContentType(
"text/html");

              PrintWriter out 
= resp.getWriter();

              String docType 
= "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> ";

 

              out.println(docType 
+ "<HTML> " + "<HEAD><TITLE> AfterForward"

                            
+ "</TITLE></HEAD> " + "<BODY BGCOLOR="#FDF5E6"> "

                            
+ "     <h1>AfterForward</h1>    </br>");

              out.println(
"</body></html>");

              System.err.println(
"canyousee " + req.getAttribute("canyousee")

                            
+ " in AfterForward");

       }


 

       
protected void doPost(HttpServletRequest req, HttpServletResponse resp)

                     
throws ServletException, IOException

       
...{

              doGet(req, resp);

       }


}


 

BeforeForwardAfterForward分别mapping<url-pattern>/BeforeForward</url-pattern><url-pattern>/AfterForward</url-pattern>

 

可以看到控制台输出如下:

canyousee this in BeforeForward

begin AfterForward!

canyousee this in AfterForward

end in BeforeForward

 

浏览器上显示的为:

  AfterForward

浏览器上urlhttp://127.0.0.1:8080/train/BeforeForward

 

从结果我们可以看到

1、             forward会显示forward后的页面的内容

2、            forward调用后浏览器的url不会变化

3、            forward后的页面和原页面的request为同一对象

 

 

下面是RequestDispatchervoid include(ServletRequest request, ServletResponse response)例子了,这个例子里,我们使用request来获取RequestDispatcher对象,所以可以使用相对路径。

BeforeInclude

 

package squall.servlet.path;

 

import java.io.IOException;

import java.io.PrintWriter;

 

import javax.servlet.RequestDispatcher;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class BeforeInclude extends HttpServlet

...{

       
protected void doGet(HttpServletRequest req, HttpServletResponse resp)

                     
throws ServletException, IOException

       
...{

              resp.setContentType(
"text/html");

              PrintWriter out 
= resp.getWriter();

              String docType 
= "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> ";

              req.setAttribute(
"canyousee""this");

 

              out.println(docType 
+ "<HTML> " + "<HEAD><TITLE> BeforeInclude"

                            
+ "</TITLE></HEAD> " + "<BODY BGCOLOR="#FDF5E6"> "

                            
+ "     <h1>BeforeInclude</h1>    </br>");

              

              RequestDispatcher rd 
= req.getRequestDispatcher(

                            
"InInclude");

              System.err.println(
"canyousee " + req.getAttribute("canyousee")

                            
+ " in BeforeInclude");

              rd.include(req, resp);

              out.println(
"     <h1>AfterInclude</h1>    </br>");

              out.println(
"</body></html>");

              System.err.println(
"end in BeforeInclude");

       }


 

       
protected void doPost(HttpServletRequest req, HttpServletResponse resp)

                     
throws ServletException, IOException

       
...{

              doGet(req, resp);

       }


}


 

InInclude

 

 

package squall.servlet.path;

 

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 InInclude extends HttpServlet

...{

       
protected void doGet(HttpServletRequest req, HttpServletResponse resp)

                     
throws ServletException, IOException

       
...{

              System.err.println(
"In InInclude!");

              PrintWriter out 
= resp.getWriter();

              out.println( 
"     <h1>In InClude</h1>    </br>");

              System.err.println(
"canyousee " + req.getAttribute("canyousee")

                            
+ " in InInclude");

       }


 

       
protected void doPost(HttpServletRequest req, HttpServletResponse resp)

                     
throws ServletException, IOException

       
...{

              doGet(req, resp);

       }


}


 

 

BeforeIncludeInInclude分别mapping<url-pattern>/path/BeforeInclude</url-pattern><url-pattern>/path/InInclude</url-pattern>

 

访问http://127.0.0.1:8080/train/path/BeforeInclude

可以看到浏览器显示为:

BeforeInclude

 

In InClude

 

AfterInclude

而控制台输出为:

canyousee this in BeforeInclude

In InInclude!

canyousee this in InInclude

end in BeforeInclude

 

需要注意的是上面的例子中的InInclude无法输出一个完整的html页面。

从结果可以看出:

1、             include会显示原页面中include的地方显示includeServlet输出的内容

2、            forward调用后浏览器的url不会变化

3、            forward后的页面和原页面的request为同一对象

 

还是要强调一下InInclude无法输出一个完整的html页面,它只是输出一部分东西而已。

讲到这里基本上servlet中请求的转发和跳转已经讲完了。

分享到:
评论

相关推荐

    PHP/Java Bridge的JavaBridge.jar、php-servlet.jar和php-script.jar

    这个技术的关键在于它的几个核心组件,其中包括JavaBridge.jar、php-servlet.jar和php-script.jar,这些都是在Java和PHP集成环境中不可或缺的部分。 1. **JavaBridge.jar**: JavaBridge.jar是PHP/Java Bridge的...

    java-servlet-api.doc

    当客户端发出请求时,Servlet引擎传递给Servlet一个ServletRequest对象和一个ServletResponse对象,这两个对象作为参数传递到service()方法中。 Servlet也可以执行ServletRequest接口和ServletResponse接口。...

    01-servlet开发入门.zip

    Servlet是Java平台上的一个核心技术,用于开发动态Web应用程序。这个"01-servlet开发入门.zip"文件很可能是为了引导初学者踏入Servlet编程的世界。它包含的01-servlet开发入门.avi视频教程,可能详细讲解了Servlet的...

    用最简单易懂的方法学java 实现登陆功能-servlet

    通常,一个简单的Servlet项目会包含以下几个部分:Web-INF目录,其中存放web.xml配置文件,src目录存放源代码,如Servlet类,以及Web内容目录,包含HTML、JSP等静态资源。在本例中,我们的焦点在于LoginServlet,它...

    7-Java-web开发17-Java-web开发17-Java-web开发17-Java-web开发17-Java-web开发

    在Java Web开发中,我们主要涉及到以下几个关键知识点: 1. **Servlet**: Servlet是Java Web应用的核心,它是Java编写的一个服务器端程序,用于处理HTTP请求。Servlet API提供了处理请求、生成响应的方法,使得...

    Java-Servlets-and-Java-Server-pages-JSP.rar_Java Servlet JSP

    Servlet生命周期包括加载、实例化、初始化、服务和销毁几个阶段。在Java Servlet API中,`HttpServlet`类是所有HTTP servlet的基础,它提供了处理GET和POST请求的方法。 **Servlet工作原理** 当一个客户端请求到达...

    达内培训课件-Servlet

    Servlet是Java Web开发中的核心组件,它主要用于处理和响应客户端(如浏览器)的请求。"达内培训课件-Servlet"是一份专为初学者设计的教程资源,旨在帮助零基础学员快速掌握Servlet技术。达内集团作为知名的IT培训...

    servlet-ppt java web相关servlet课件

    本课件主要涵盖了以下几个方面的内容: 1. **Servlet基础**: - Servlet是一个Java类,它扩展了Java平台,使得Java可以用来处理Web应用程序中的动态内容。 - 通过实现Servlet接口或继承HttpServlet基类来创建...

    script-api.jar,php-servlet.jar,php-script.jar,JavaBridge

    在这个特定的场景中,我们关注的几个关键`jar`文件包括:`script-api.jar`, `php-servlet.jar`, `php-script.jar`以及`JavaBridge.jar`,它们在Java与PHP交互中扮演着重要角色。 1. **script-api.jar**:这个文件很...

    小型java系统开发-签到系统

    通过这个项目,我们可以学习到以下几个关键知识点: 1. **Java语言基础**:Java是一种广泛使用的面向对象编程语言,具有跨平台、安全性和高效性等特点。在本项目中,开发者会接触到Java的基础语法、类和对象的创建...

    java+servlet源码

    - ProjectManagementSys项目可能包含以下几个关键部分: - src目录:存放源代码,包括Servlet类和其他业务逻辑类。 - WebContent目录:存放Web应用资源,如HTML、CSS、JavaScript、JSP页面等。 - WEB-INF子目录...

    jsp网页设计----Servlet简化设计,逻辑与界面设计分开,开发更方便;

    JavaServer Pages(JSP)是Java技术在Web开发领域中的一个重要组成部分,用于构建动态网页。JSP的核心思想是将业务逻辑(Servlet)与用户界面(HTML)分离,从而提高开发效率和可维护性。 1. **JSP的概念** - JSP...

    oop-java-servlet-Readdeo:oop-java-servlet-Readdeo由GitHub Classroom创建

    "oop-java-servlet-Readdeo:oop-java-servlet-Readdeo由GitHub Classroom创建" 这个标题表明这是一个关于面向对象编程(OOP)和Java Servlet技术的项目,它来源于GitHub Classroom,一个用于教学和学习的平台。...

    oop-java-servlet-akosVogel-1:oop-java-servlet-akosVogel-1由GitHub Classroom创建

    标题中的"oop-java-servlet-akosVogel-1"表明这是一个关于面向对象编程(OOP)在Java中应用的项目,特别是涉及到Servlet技术。Servlet是Java Web开发中的一个核心组件,主要用于处理HTTP请求并生成动态响应。...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    Servlet-Servlet生命周期

    Servlet的生命周期主要包括以下几个阶段: 1. **加载和实例化**:当服务器启动时或者首次访问Servlet时,服务器会加载并实例化Servlet。 2. **初始化**:初始化阶段由`init()`方法完成。这个方法只执行一次,通常...

    综合实战-servlet

    在IT行业中,Servlet技术是Java Web开发的核心组件之一,它为服务器端提供了处理HTTP请求的能力。本实战项目“综合实战-servlet”旨在强化对Servlet的理解和应用,通过实现用户登录注册以及一系列的增删改查功能,...

    JSP-servlet-struts-sqlserver开发的网上购物商场

    【标题】"JSP-servlet-struts-sqlserver开发的网上购物商场"揭示了这个项目是基于Java技术栈,利用JSP(JavaServer Pages)、Servlet、Struts框架以及SQL Server数据库构建的一个网上商城系统。这样的系统设计允许...

    用于servlet程序的开发的servlet-jar包

    Servlet API主要包括以下几个关键概念和类: 1. **Servlet**:这是所有服务器端Java小程序的基类,实现了Servlet接口。用户自定义的Servlet类需要继承`javax.servlet.Servlet`或更具体的抽象类,如`javax.servlet....

    Java开发指南-Servlets和JSP篇

    Servlet生命周期包括加载、实例化、初始化、服务、销毁几个阶段。开发Servlet时,需要实现Servlet接口或继承HttpServlet类,并覆盖其doGet、doPost等方法来处理HTTP请求。Servlets可以处理各种HTTP方法,如GET、POST...

Global site tag (gtag.js) - Google Analytics