当前位置: 首页 > 图文教程 > 网络编程 > JSP > MVC渐行渐进(二)

JSP
搭建Eclipse+MyEclipse开发环境
卖jsp编程技巧的那个垃圾的所有实例的答案全部已收集,现将他人收集的实例答案公布出来,大家鉴赏!
一个jsp+AJAX评论系统
JSP 多个文件打包下载代码
JSP 动态树的实现
jsp 重复提交问题
J2ME/J2EE实现用户登录交互 实现代码
访问JSP文件或者Servlet文件时提示下载的解决方法
JSP EL表达式详细介绍
JSP 报表打印的一种简单解决方案
jsp 自定义标签实例
AJAX自学练习 无刷新从数据库后台取数据显示
AJAX 自学练习 请求与显示
AJAX 自学练习 无刷新提交并修改数据库数据并显示
jsp 文件上传浏览,支持ie6,ie7,ie8
JSP application(return String)用法详例
jsp form表单方法示例
JSP request(return String)用法详例
JSP forward用法分析实例代码分析
JSP JavaBean的setProperty属性

JSP 中的 MVC渐行渐进(二)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-03   浏览: 53 ::
收藏到网摘: n/a

ActionRouter类 
示例:/WEB-INF/classes/actions/ActionFactory.java 
package actions; 
import javax.servlet.GenericServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
public class ActionRouter 

private final String url; 
private final boolean isForward; 
public ActionRouter(String url) 

this(url,true); 

public ActionRouter(String url,boolean isForward) 

this.url=url; 
this.isForward=isForward; 

public void route(GenericServlet servlet,HttpServletRequest req,HttpServletResponse res) 

try 

if (isForward) 

//req.getRequestDispatcher(res.encodeURL(url)).forward(req,res); 
//req.getRequestDispatcher(res.encodeURL("/index.jsp")).forward(req,res); 
servlet.getServletContext().getRequestDispatcher(res.encodeURL(url)).forward(req,res); 

else 

res.sendRedirect(res.encodeRedirectURL(url)); 


catch(Exception e) 

System.out.print(e); 



操作路径选择器功能是转发或重定向请求。(所有类均可在\Tomcat 4.1\common\lib\ servlet.jar包中找到。) 
导读:  
前提知识:Servlet的软件包:打开Tomcat 4.1下的Servlet.jar我们发现Servlet包主要由javax.Servlet和javax.Servlet.http和javax.Servlet.jsp三个包组成,javax.Servlet.jsp这里就不计论。前两种包的所包含的方法和接口如下表所示: 
     包      提供的接口    提供的方法 
javax.Servlet RequestDispatcher接口Servlet接口ServletConfig接口ServletContext接口ServletRequest接口ServletResponse接口SingleThreadModel接口 GenericServlet类ServletInputStream类ServletOutputStream类ServletException类UnavailableException类 
javax.Servlet.http HttpServletRequest接口HttpServletResponse接口HttpSession接口HttpSessionContext接口HttpSessionBindingListener接口 Cookie类HttpServlet类HttpSessionBindingEvent类HttpUtils类 
继承关系示例: 
java.lang.Object 

+--javax.servlet.GenericServlet 

+--javax.servlet.http.HttpServlet 

+--org.apache.struts.action.ActionServlet 

1、GenericServlet类 
Public abstract class GenericServlet implants Servlet 
此类提供了servlet接口的基本实现部分,其service()方法被申明为abstract,因此需要被派生。init(ServletConfig conf)方法把servletConfig对象存储在一个private transient(私有临时)实例变量里,getServletConfig()方法返回指向本对象的指针,如果你重载此方法,将不能使用getServletConfig来获得ServletConfig对象,如果确实想重载,记住要包含对super.config的调用。2.1版的API提供一个重载的没有参数的init()方法。现在在init(ServletConfig)方法结束时有一个对init()的调用,尽管目前它是空的。2.1版API里面,此类实现了ServletConfig接口,这使得开发者不用获得ServletConfig对象情况下直接调用ServletConfig的方法,这些方法是: 
getInitParameter(),getInitParameterNames(),getServletContext()。此类还包含两个写日志的方法,它们实际上调用的是ServletContext上的对应方法。log(String msg)方法将servlet的名称和msg参数写到容器的日志中,log(String msg,Throwable cause)除了包含servlet外还包含一个异常。 
2、HttpServlet类:该类扩展了GenericServlet类并对servlet接口提供了为处理 HTML 表单提供了专门的方法。例: 
service(): 
   protected void service(HttpServletRequest req,HttpServletResponse res)  
            throws ServletException,IOException 
     public void service(HttpServletRequest req,HttpServletResponse res) 
           throws ServletException,IOException 
该方法作为HTTP请求的分发器,这个方法在任何时候都不能被重载。当请求到来时,service()方法决定请求的类型(GET,POST,HEAD,OPTIONS,DELETE,PUT,TRACE),并把请求分发给相应的处理方法(doGet(),doPost(),doHead(),doOptions(),doDelete(),doPut(),doTrace())每个do方法具有和第一个service()相同的形式。为了响应特定类型的HTTP请求,我们必须重载相应的do方法。如果servlet收到一个HTTP请求而你没有重载相应的do方法,它就返回一个说明此方法对本资源不可用的标准HTTP错误。 
   HttpServlet类的init()方法、service()方法和destroy()方法,这三种方法表示了了一个servlet 的生命周期。即初始化时期、执行时期、结束时期。 
3、HttpServletRequest接口:所有实现此接口的对象(例如从servlet容器传递的HTTP请求对象)都能让servlet通过自己的方法访问所有请求的数据。下面是一些用来获取表单数据的基本方法。其中定义的主要方法有: 
a、 getParameter() =>public String getParameter(String key) 
b、 getParameterValues()=> public String[] getParameterValues(String key) 如果一个参数可以返回多个值,比如复选框集合,则可以用此方法获得对应参数的所有值。如果请求信息中没有指定参数,则返回null。 
c、 GetParameterNames()=> Public Enumeration getParameterNames()此方法返回一个Enumeration对象,包含对应请求的所有参数名字列表。 
d、 获得传入路径的方法:例: 
http://localhost:7001/myservlet/somepath/test?someparam=somevaluerequest.getPathInfo():返回/somepath/test 
request.getRequestURL():http://localhost:7001/myservlet/somepath/test 
request.getRequestURI():返回/myservlet/somepath/test 
request.getServletPath():返回/myservlet 
request.getQueryString():返回someparam=somevalue 
4、HttpServletResponse接口:servlet容器提供一个实现该接口的对象并通过service()方法将它传递给servlet。通过此对象及其方法,servlet可以修改响应头并返回结果。其中定义的主要方法有: 
a、 setContentType()=> public void setContentType(String type) 在给调用者发回响应前,必须用此方法来设置HTTP响应的MIME类型。可以是任何有效的MIME类型,当给浏览器返回HTML是就是”text/html”类型。 
b、 getWriter()=>public PrintWriter getWriter()throws IOException此方法将返回PrintWriter对象,把servlet的结果作为文本返回给调用者。PrintWriter对象自动把Java内部的UniCode编码字符转换成正确的编码以使客户端能够阅读。 
c、 getOutputStream()=>public ServletOutputStream getOutputStream() throws IOException此方法返回ServletOutputStream对象,它是java.io.OutputStream的一个子类。此对象向客户发送二进制数据。 
d、 setHeader()=>public void setHeader(String name,String value) 此方法用来设置送回给客户的HTTP响应头。有一些快捷的方法用来改变某些常用的响应头,但有时也需要直接调用此方法。 
5、javax.servlet.ServletContext接口: 安装在一个服务器中的一个特定URL名字空间(比如,/myapplication)下的所有Servlet,JSP,JavaBean等Web部件的集合构成了一个Web的应用,每一个Web应用(同一JVM),容器都会有一个背景对象,而javax.servlet.ServletContext接口就提供了访问这个背景对象的途径。 
Servlet实例的getServletContext方法: 得到该Servlet运行其中的这个背景对象。从这个背景对象中你可以访问如下信息或资源:(注意该方法不是ServletContext的方法而是获取背景对象的方法由于HttpServlet继承Servlet的关系GenericServlet类和HttpServlet类同时具有该方法) 
· 初始化参数  ServletContext.getInitParameter(String name)。 
· 存储在背境中的对象 context.getAttribute(String name) 
· 与本背景关联的资源 ServletContext.getResource(String path) 
· 日志 ServletContext.log(String msg) 
以上所示方法均为ServletContext所提供,值得一提的是对于存储在背境中的对象访问方法常用的还有: 
 context.setAttribute(String name, Object object);将特定名字绑定的任意类型的对象上。将把object对象绑定到名字name,存放在Servlet背景中,可供同一背景中的其他Servlet共享。其他Servlet可以通过context.getAttribute(String name),得到一个背景中的对象,或通过context.removeAttribute(String name)在背景中移除一个对象。 
getRequestDispatcher方法:它的作用将一个包含路径的String传递给其它资源。该路径是相对于ServletContext的根路径的。.方法示例: 
RequestDispatcher rd = request.getRequestDispatcher("SecondServlet");  
rd.forward(request, response);. 
该方法主要用于服务器重定向技术上,servlet中重定向的方法主要有两种分别由ServletContext接口和ServletRequest接口提供但二者提供的同名方法getRequestDispatcher却有很大的不同。在ActionRouter类示例中//req.getRequestDispatcher(res.encodeURL(url)).forward(req,res);表示的用ServletRequest接口提供方法进行重定向的。