虽然一直号称熟悉ssh,不过因为工作好久都没有亲手配置过了,前两天竟然被一个小兄弟问住了,决定仔细的复习一遍
首先我下载了struts-2.2.3-apps这是struts的一些范例
我从struts2-blank这个应用看起
首先看它的web.xml
它使用org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter这个filter来做前端控制器接管所有请求
欢迎页面配置的是index.html,在index.html里会自动重定向到/example/HelloWorld.action这个路径下
这个请求被struts容器接管了,由于没有进行特别的配置,strtus会使用class目录下的struts.xml中的配置来工作
在这里可以看到它配置了全局异常,使用/error.jsp来呈现
另外配置了一个名为index的action,它的相应类型是redirectAction也会转到/example/HelloWorld.action下
末尾它还include了一个配置文件example.xml
通过这一行下面的注释
<!-- Add packages here -->我们可以看出来strtus推荐把不同package的配置放到独立的文件中
接下来我再看example.xml中的配置
在example.xml中根目元素struts下面是一个package元素,这个元素不太熟悉先跳过
package下面是几个action元素
首先是HelloWord action使用的class是example.HelloWord(这显然是类的全路径),等下我们要依次看每个类如何实现的,result是/example/HelloWorld.jsp,就是说无论执行结果为何都使用这个jsp来呈现相应
第二个是Login_*其中的*是一个通配符,区别于第一个action,它有一个method属性method="{1}",它的class是example.Login,可以推测,当我们访问Login_input.action这个地址是,strtus框架会调用example.Lonin.input这个方法,它有两个result,<result name="input">/example/Login.jsp</result>和<result type="redirectAction">Menu</result> ,也就是说当result为"input"时,使用/example/Login.jsp呈现,其他结果时重定向到Menu这个路径下
下一个action比较直白
<action name="*"
class="example.ExampleSupport">
<result>/example/{1}.jsp</result>
</action>
可以看出来,/Menu.action会使用/eaxmple/Menu.jsp来呈现相应
{1}应该是表示*所匹配的字符,这是我根据正则的占位符规则猜测的。
接下来看HelloWorld.java的实现,他继承了strtus的ActionSupport继承,并且有一个属性message,在execute方法中设置了这个message的值
那么这个属性怎么呈现到相应中去呢,HelloWorld.jsp中给出了答案
<s:property value="message"/>
这是从ActionSupport里继承的action需要覆盖execute方法
我们再来看看Login.java是如何实现的,我们发现实际上Login也是从ActionSupport继承来了,并不像前面推测的有什么input方法,所以调用Login的时候永远都是调用它的execute方法
现在又多了一个疑问action中的method属性有什么作用呢?
通过观察action实现和strtus配置文件我们可以知道,action总是返回一个字符串作为抽象view名字,而action的result中配置抽象view和实际view的映射关系
最后我们再来看看jsp中海油那些tag
Login里有4个tag,功能一目了然
<s:form action="Login">
<s:textfield key="username"/>
<s:password key="password" />
<s:submit/>
</s:form>
to be continued....