论坛首页 Java企业应用论坛

tomcat源码—redirect和forward的实现

浏览 25562 次
该帖已经被评为精华帖
作者 正文
   发表时间:2009-12-29  
servlet 2.4版本是用xml schema做的验证吧,最初为了stripes用的2.4,不少地方都别扭,web.xml在eclipse里一直显示有错(插件没更新....),升级的要小心。
0 请登录后投票
   发表时间:2009-12-29   最后修改:2009-12-29
Foxswily 写道
servlet 2.4版本是用xml schema做的验证吧,最初为了stripes用的2.4,不少地方都别扭,web.xml在eclipse里一直显示有错(插件没更新....),升级的要小心。


0 请登录后投票
   发表时间:2009-12-31  
LZ,我在web.xml配置中增加<dispatcher>FORWARD</dispatcher>这句配置后,发送请求就报404错误啊!
我的项目用的是ssh+tomcat+mysql,我用的是struts2。
想请教下是怎么回事呢?是还需要配置什么地方吗?
0 请登录后投票
   发表时间:2009-12-31   最后修改:2009-12-31
vera_sq 写道
LZ,我在web.xml配置中增加<dispatcher>FORWARD</dispatcher>这句配置后,发送请求就报404错误啊!
我的项目用的是ssh+tomcat+mysql,我用的是struts2。
想请教下是怎么回事呢?是还需要配置什么地方吗?


两个都配置起来,本来以为FORWARD是包含REQUEST。
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.htm</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
刚我试过了,可以用的
0 请登录后投票
   发表时间:2009-12-31  
向楼主致敬 学习 我学到东西了
0 请登录后投票
   发表时间:2009-12-31  
luckaway 写道


两个都配置起来,本来以为FORWARD是包含REQUEST。
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.htm</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
刚我试过了,可以用的


我照你的配了报错啦 500 错误

贴一点错误

javax.servlet.ServletException: Filter execution threw an exception
	org.apache.struts2.dispatcher.ServletDispatcherResult.doExecute(ServletDispatcherResult.java:154)
	org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:186)
	com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:361)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:265)
	org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
	org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:468)

0 请登录后投票
   发表时间:2009-12-31  
hanjiangit 写道
luckaway 写道


两个都配置起来,本来以为FORWARD是包含REQUEST。
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.htm</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
刚我试过了,可以用的


我照你的配了报错啦 500 错误

贴一点错误

javax.servlet.ServletException: Filter execution threw an exception
	org.apache.struts2.dispatcher.ServletDispatcherResult.doExecute(ServletDispatcherResult.java:154)
	org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:186)
	com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:361)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:265)
	org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
	org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:468)



你是不是tomcat版本太低了! dispatcher的特性是servlet2.4规范里加的!

tomcat版本和servlet规范的对应

http://tomcat.apache.org/whichversion.html
0 请登录后投票
   发表时间:2010-01-01  
luckaway 写道
网上已经有很多关于redirect和forward区别的文章,更多的都是只是一些概念上的描述,虽然在大多情况下,知道这些就已经足够了。但也有例外:forward not working for struts2,why?我也是在工作中碰到了这个问题,才特意看了下tomcat有关这部分的源代码。深刻的了解下也无妨。
redirect和forward都是属于servlet规范的,不同的servlet容器的实现可能会有一些区别,但原理都是类似的。

redirect和forward的定义:
1. redirect(重定向):服务端发送给客户端一个重定向的临时响应头,这个响应头包含重定向之后的URL,客户端用新的URL重新向服务器发送一个请求。
2. forward(请求转向):服务器程序内部请求转向,这个特性允许前一个程序用于处理请求,而后一个程序用来返回响应。

Redirect的原理比较简单,它的定义也已经描述的很清楚了,我也不想多讲什么,就贴一段简单的代码吧!
。。。。。。。。。。。。。。。。。。


赞楼主一个,想问下lz,Tomcat中SessionListener的机制。多个Session同时创建时,是形成一个队列调用session.create方法,还是各自并发地调用session.create方法?

应该需要分析源码吧?(给我点提示也可以)谢谢啦!
0 请登录后投票
   发表时间:2010-01-01   最后修改:2010-01-01
xiaolongfeixiang 写道
luckaway 写道
网上已经有很多关于redirect和forward区别的文章,更多的都是只是一些概念上的描述,虽然在大多情况下,知道这些就已经足够了。但也有例外:forward not working for struts2,why?我也是在工作中碰到了这个问题,才特意看了下tomcat有关这部分的源代码。深刻的了解下也无妨。
redirect和forward都是属于servlet规范的,不同的servlet容器的实现可能会有一些区别,但原理都是类似的。

redirect和forward的定义:
1. redirect(重定向):服务端发送给客户端一个重定向的临时响应头,这个响应头包含重定向之后的URL,客户端用新的URL重新向服务器发送一个请求。
2. forward(请求转向):服务器程序内部请求转向,这个特性允许前一个程序用于处理请求,而后一个程序用来返回响应。

Redirect的原理比较简单,它的定义也已经描述的很清楚了,我也不想多讲什么,就贴一段简单的代码吧!
。。。。。。。。。。。。。。。。。。


赞楼主一个,想问下lz,Tomcat中SessionListener的机制。多个Session同时创建时,是形成一个队列调用session.create方法,还是各自并发地调用session.create方法?

应该需要分析源码吧?(给我点提示也可以)谢谢啦!


并发的调用session.create方法的,是设置sessionId的时候通知接听器的!!!

org.apache.catalina.session.StandardSession



  /**
     * Set the session identifier for this session.
     *
     * @param id The new session identifier
     */
    public void setId(String id) {

        if ((this.id != null) && (manager != null))
            manager.remove(this);

        this.id = id;

        if (manager != null)
            manager.add(this);
        tellNew();
    }



tellNew():
 public void tellNew() {

        // Notify interested session event listeners
        fireSessionEvent(Session.SESSION_CREATED_EVENT, null);

        // Notify interested application event listeners
        Context context = (Context) manager.getContainer();
        Object listeners[] = context.getApplicationLifecycleListeners();
        if (listeners != null) {
            HttpSessionEvent event =
                new HttpSessionEvent(getSession());
            for (int i = 0; i < listeners.length; i++) {
                if (!(listeners[i] instanceof HttpSessionListener))
                    continue;
                HttpSessionListener listener =
                    (HttpSessionListener) listeners[i];
                try {
                    fireContainerEvent(context,
                                       "beforeSessionCreated",
                                       listener);
                    listener.sessionCreated(event);
                    fireContainerEvent(context,
                                       "afterSessionCreated",
                                       listener);
                } catch (Throwable t) {
                    try {
                        fireContainerEvent(context,
                                           "afterSessionCreated",
                                           listener);
                    } catch (Exception e) {
                        ;
                    }
                    manager.getContainer().getLogger().error
                        (sm.getString("standardSession.sessionEvent"), t);
                }
            }
        }

    }



必须要保证SessionListener的实现类是线程安全的!




如果你对接听器模式不太了解的话,建议你先去学习接听器模式!
SessionListener就是接听器模式
0 请登录后投票
   发表时间:2010-01-04  
luckaway 写道
vera_sq 写道
LZ,我在web.xml配置中增加<dispatcher>FORWARD</dispatcher>这句配置后,发送请求就报404错误啊!
我的项目用的是ssh+tomcat+mysql,我用的是struts2。
想请教下是怎么回事呢?是还需要配置什么地方吗?


两个都配置起来,本来以为FORWARD是包含REQUEST。
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.htm</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
刚我试过了,可以用的


LZ,我以前好像也有遇到过你这样的问题,不过好像Sturts2.0他的默认方式是用forward的,所以也可以不用设置的。你试试呢!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics