初学struts,不太理解映射中的.do.

03-04-20 lyojbuilder
那位朋友能给我讲解一下struts映射中的.do 或.frm的作用?或讲解的文章。多谢!

jxb8901
2003-04-21 11:08
在struts中定义了一个中心控制器,用于接收并处理所有客户端请求,但怎样让struts做到这一点呢? 就是在web.xml中定义一个请求的映射,以通知servlet容器将所有以.do(或其它定义)结尾的请求都传给struts处理.
其实这和我们要指定Servlet A处理A请求, Servlet B处理B请求时, 也必须指定请求的映射是一样的原理.

不知有没有解答你的疑惑?

lyojbuilder
2003-04-23 00:21
多谢你的回复,我的意思是为什莫struts不直接用点对点的映射,就是把".do"改成".jsp",就是在servlet中把servlet直接映射到某个.jsp的文件?为什莫不用.jsp作为文件后追名呢?

jxb8901
2003-04-23 09:18
你可以看一下tomcat\conf目录中的web.xml文件, 其中有这样一段:

    <servlet>
        <servlet-name>jsp</servlet-name>
        <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
        <init-param>
            <param-name>logVerbosityLevel</param-name>
            <param-value>WARNING</param-value>
        </init-param>
        <load-on-startup>3</load-on-startup>
    </servlet>
<p class="indent">

这表明后缀为jsp的文件已经被tomcat处理了, 如果struts重载该设置, 肯定会造成混淆, 而且有时候在使用struts的项目里面也会有让用户直接请求jsp文件的用法, 何况使用.do又有什么不好的呢?

lyojbuilder
2003-04-23 10:21
多谢。意思就是说struts处理jsp的体系是和Tomcat不同的。如果用.do作为后缀,因为Tomcat没有这样的规定,所以就不会处理,这时他由struts处理。如果用.jsp作后缀,因为先前Tomcat做了这样的规定,所以Tomcat和struts都会按照各自的方式处理,就会出错。可问题是Tomcat和struts不是集成的吗,他们在一个web应用程序中共用一个web.xml文件,处理.jsp怎末会有冲突呢?是不是有约定:Tomcat只按照自己的方式处理.jsp的文件?有的程序某个部分不希望以Tomcat的方式处理,比如希望用struts处理,这时候就不用.jsp作为映射的后缀?

jxb8901
2003-04-23 11:43
struts根本不会处理.jsp的请求, 也就是说.jsp的请求不会到达struts的ActionServlet, 而tomcat也不会处理.do的请求, 但.do的请求是先到达tomcat, tomcat会根据web.xml中定义的mapping查找处理该请求的servlet, 这时就会找到struts, 由struts处理.do请求.

另外要注意在tomcat中有两个web.xml文件, conf目录中的web.xml中的定义为所有tomcat应用程序共享, 各个tomcat应用程序可以在自己的WEB-INF\web.xml文件中定义自己的设置.

有理解不对的地方请高手指正.

lyojbuilder
2003-04-23 13:53
多谢!下面是官方给出的回答,后面关键的几句看的不是很懂,jxb8901:你能帮我看看他们的解释和你说的有什麽区别吗?
////////////////////////////reply///////////////////////////////
*.jsp is registered with the JSP container, so you don't want to confuse things mapping your controller servlet to *.jsp. They call it *.do because that is what is happenin, you are DOing something. You can register it as *.heylookyhere_ihaveacustom_extention

When your servlet answers under multiple names, you can determine which action to take based upon the requestURI passed up. For instance, if you answer as UpdateMyInfo.do, then you will invoke your UpdateMyInfo module. If you answer as UpdateExtraInfo.do, then you will invoke your UpdateYourInfo module. It breaks all of the work your application needs to do into nice small modules for easier control and maintenance. Plus it allows you to chain together multiple actions by setting up your own flows.

jxb8901
2003-04-23 14:59
很报歉, 我的E文不是很好, 我也不太明白该回复的含意, 其大意好象是说, 可以把程序的动作分解为多个小的有意义的单元(便于控制与维护的单元), 每一个单元相当于一个action, 然后依据设定的控制流将多个action组合在一起"链式"地处理用户请求.

有E文好的朋友请再解释一下!

banq
2003-04-23 17:54
.do表示是一个Action,这个Action是一个javabean,说白了是Servlet。
而.jsp则就是jsp了

这就是区别。

lyojbuilder
2003-04-23 18:57
多谢楼上两位,我在找找资料。也许自己多实践一下就可以了。