最近正好有时间总结一下,过去的知识历程,虽说东西都是入门级的,高手肯定是不屑一顾了,但是对于初次涉猎的小白们,还是可以提供点参考的。
struts2其实就是为我们封装了servlet,简化了jsp跳转的复杂操作,并且提供了易于编写的标签,可以快速开发view层的代码。
过去,我们用jsp和servlet搭配,实现展现时,大体的过程是:
1 jsp触发action
2 servlet接受action,交给后台class处理
3 后台class跳转到其他的jsp,实现数据展现
Struts 2 体系结构 :
1、Web浏览器请求一个资源。
2、过滤器Dispatcher查找方法,确定适当的Action。
3、拦截器自动对请求应用通用功能,如验证和文件上传操作。
4、Action的execute方法通常用来存储和重新获得信息。
5、结果被返回到浏览器。
搭建Struts 2 开发环境
1、找到开发Struts 2的应用需要用到的jar包。
2、编写Struts 2的配置文件。
<struts>
<!--
<package>元素有如下属性:
name:包的名称。必须配置
extends:要继承的包,后面配置的是被继承的包的名称。(最好加上防止出现莫名其妙的错误)
namespace:包的命名空间。可选
abstract:定义包为抽象的,也就是不能包含Action的定义。可选
-->
<package name="hello" namespace="/" extends="struts-default">
<action name="hello" class="com.hyxd.action.HelloAction" method="hello">
<result name="success">/index.jsp</result>
</action>
</package>
</struts>
3、在web.xml中加入Struts 2 MVC启动框架配置。
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- 引入struts核心过滤器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
开发Struts 2 最少用到的jar文件:
Struts-core-2.x.x.jar : Struts 2 框架的核心类库
xwork-2.x.x.jar : XWork类库,Struts 2 在其上构建
ognl-2.6.x.jar : Object Graph Navigation Language , Struts 2 框架通过其读写对象的属性。
freemarker-2.3.x.jar : Struts 2 的UI标签的模版使用 Freemarker编写。
commons-logging-1.1.x.jar : ASF出品的日志包。
commons-fileupload-1.2.1.jar : 文件上传组件。
路径后缀问题:
先通过struts2的配置文件看看默认的路径后缀都有哪些。
struts.action.extension=action,,这个是struts2的默认后缀名空格或.action.我们也可以将其修改为其他形式
<struts>
<!-- name=key(对应的拦截器) value=value(你要设置的后缀名) -->
<constant name="struts.action.extension" value="do,action,html,,"></constant>
</struts>
通配符问题
:
在开发当中有很多的时候在调用同一个方法,和同一个页面,你需要写一堆的struts的配置信息,为了方便开发apache为struts提供了通配符
*:但不包括 / 字符. 如果想把 / 字符包括在内, 需要使用 **. 如果需要对某个字符进行转义, 需要使用 \.
{1}:这是作为占位符使用的,它将被通配符所匹配的值替换
<struts>
<package name="helloAction" extends="struts-default" namespace="/">
<action name="*" class="com.hyxd.user.UserAction" method="{1}">
<result name="login">/error.jsp</result>
</action>
</package>
</struts>
动态方法调用
动态方法调用: 通过 url 动态调用 Action 中的方法,如果Action中存在多个方法时,我们可以使用!+方法名调用指定方法。默认情况下, Struts 的动态方法调用处于激活状态, 若想禁用该功能, 则可以在 struts.xml 文件中添加如下 constant 元素:
<struts>
<!-- key=DynamicMethodlnvocation拦截器 value=false -->
<constant name="struts.action.DynamicMethodlnvocation" value="false"></constant>
</struts>
使用动态调用:
<form action="${pageContext.request.contextPath }/UserAction!add" method="post">
用户名: <input type="text" name="user.name"> <br/>
密码: <input type="text" name="user.pwd"> <br/>
<input type="submit" value="添加"> <br/>
</form>
<struts>
<package name="user" extends="struts-default" namespace="/">
<action name="UserAction" class="com.hyxd.user.UserAction">
<result name="success">/index.jsp</result>
</action>
</package>
</struts>
结果:
全局定义
当多个action中都使用到了相同result,为了避免result的重复,这时我们应该把result定义为全局结果。
<struts>
<!-- 如果全局和局部有同名的result,那么局部会覆盖全局的result。
同一个应用中每次请求Struts2框架都会创建一个新的Action实例 -->
<package name="user" extends="struts-default" namespace="/">
<global-results>
<result name="save">/index.jsp</result>
</global-results>
<action name="UserAction" class="com.hyxd.user.UserAction">
</action>
</package>
</struts>
待续