免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2083 | 回复: 0
打印 上一主题 下一主题

MVC渐行渐进(二) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-08-02 21:25 |只看该作者 |倒序浏览
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接口提供方法进行重定向的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP