Servlet中的几个对象:
HttpServletRequest、HttpSession、ServletContext,这三个对象都有
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:
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)方法。
和
HttpResponse的void sendRedirect(String location)方法。
我们先来介绍HttpResponse的void sendRedirect(String location)方法。
这个方法将请求一个url为location的页面, location可以是一个相对路径、相对于当前WEB应用的路径或者直接Http开头的路径,下面让我们看一个例子吧。
BeforeSendRedirect:
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:
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
可以看出使用HttpResponse的void sendRedirect(String location)方法
1、 html页面会显示location所输出的页面
2、 浏览器上的url也为location的绝对路径
3、 原servlet调用void sendRedirect(String location)方法后,剩下的代码也会执行
4、 原servlet和跳转至的servlet的HttpServletRequest对象不是同一个对象。
下面该是
RequestDispatcher的
void forward(ServletRequest request, ServletResponse response)和
void include(ServletRequest request, ServletResponse response)方法的介绍。
在这之前,我们先来看下javax.servlet.RequestDispatcher对象的获得方法。
获得这个对象的方法,存在于3个类或者接口中分别是ServletContext、ServletRequest和ServletRequestWrapper。这里我们只看ServletContext和ServletRequest。
在ServletContext和ServletRequest中获取RequestDispatcher都是通过方法RequestDispatcher getRequestDispatcher(String path),但是需要注意这个方法在用不同的类调用的时候存在一些差异,使用ServletContext接口的对象调用时,String path的参数必须以”/”开头,也就是说从这个web项目的根开始。而使用ServletRequest接口的对象调用这个方法时,path可以不以”/”开头,简单的说就是可以使用相对于当前请求的相对路径。
下面我们先来看RequestDispatcher的void forward(ServletRequest request, ServletResponse response)方法,按照惯例,我们还是用例子来说明问题。
BeforeForward:
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:
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);
}
}
BeforeForward和AfterForward分别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
浏览器上url为http://127.0.0.1:8080/train/BeforeForward
从结果我们可以看到
1、 forward会显示forward后的页面的内容
2、 forward调用后浏览器的url不会变化
3、 forward后的页面和原页面的request为同一对象
下面是RequestDispatcher的void include(ServletRequest request, ServletResponse response)例子了,这个例子里,我们使用request来获取RequestDispatcher对象,所以可以使用相对路径。
BeforeInclude:
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:
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);
}
}
BeforeInclude和InInclude分别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的地方显示include的Servlet输出的内容
2、 forward调用后浏览器的url不会变化
3、 forward后的页面和原页面的request为同一对象
还是要强调一下InInclude无法输出一个完整的html页面,它只是输出一部分东西而已。
讲到这里基本上servlet中请求的转发和跳转已经讲完了。
相关推荐
当客户端发出请求时,Servlet引擎传递给Servlet一个ServletRequest对象和一个ServletResponse对象,这两个对象作为参数传递到service()方法中。 Servlet也可以执行ServletRequest接口和ServletResponse接口。...
1.1 Java的诞生与发展 1.2 Java的特点 1.3 三种平台简介 1.4 Java JDK的安装和配置 1.5 Java 运行系统与开发流程 1.6 常用开发工具简介 1.7 注释 第1章 Java语言概述 第1章-Java语言概述-Java面向对象程序设计教程-...
本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。. 本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...
本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。. 本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...
本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。. 本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...
java开发基于Servlet+JSP实现图书管理系统源代码(也可作为你的本科毕业设计)。这是一个基于Servlet+JSP 实现的一个学习项目,完全可以跑起来,也可以作为你的毕业设计的项目 本项目使用的数据库是MySQL数据库,...
本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。. 本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...
2-4 用JSP开发Web应用的几种主要方式 2-4-1 直接使用JSP 2-4-2 JSP + JavaBeans 2-4-3 JSP + JavaBeans + Servlet 2-5 JSP + JavaBeans实现的高级功能 2-5-1 用JSP访问数据库 2-5-2 用JSP + JavaBeans 实现...
Java面试题04.java中int占几个字节 Java面试题05.java面向对象的特征 Java面试题06.装箱和拆箱 Java面试题07.==和equals的区别 Java面试题08.String Java面试题09.讲一下java中的集合 Java面试题10.ArrayList 和...
16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 123 17.介绍一下Hibernate的二级缓存 123 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message ...
SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来控制 Linux 桌面,例如打开google搜索、鼠标点击、下一窗口、打开帮助、静音等操作。 Java发送短信包...
用JAVA开发的一个小型的目录监视系统,系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。 Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历,...
用JAVA开发的一个小型的目录监视系统,系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。 Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历,...
事件监听器用于对程序中发生的事件进行监听,在监听的过程中会涉及几个重要组成部分: 事件(Event) 事件源 事件处理器 事件监听器(Listener) 用户的一个操作,如点击一个按钮、调用一个方法、创建一个对象等。 ...
SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来控制 Linux 桌面,例如打开google搜索、鼠标点击、下一窗口、打开帮助、静音等操作。 Java发送短信包...
Java面试题04.java中int占几个字节 Java面试题05.java面向对象的特征 Java面试题06.装箱和拆箱 Java面试题07.==和equals的区别 Java面试题08.String Java面试题09.讲一下java中的集合 Java面试题10.ArrayList 和...
1.3 JSP开发Web的几种主要方式 1.3.1 直接使用JSP 1.3.2 JSP+JavaBeans 1.3.3 JSP+JavaBeans+Servlet 1.3.4 J2EE开发模型 1.4 本书用到的软件及获取 第2章 预备知识 2.1 Java程序设计基础 2.1.1 Java语言...
SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来控制 Linux 桌面,例如打开google搜索、鼠标点击、下一窗口、打开帮助、静音等操作。 Java发送短信包...
Java的主要特点和优势包括以下几个方面: 跨平台性(Write Once, Run Anywhere): Java的代码可以在不同的平台上运行,只需编写一次代码,就可以在任何支持Java的设备上执行。这得益于Java虚拟机(JVM),它充当了...
Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序实用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中 取代CMP,完成数据持久化的重任。 大多数...