一、什么是Struts2?
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。
二、在项目中如何使用Struts2?
分以下几步进行:
1、导入jar包,下面这些包都是搭建struts2所必须的,也就是将以下这些包复制到项目的lib目录下。
struts2-core-2.3.16.3.jar—这个是struts2的核心jar包
xwork-core-2.3.16.3.jar
freemarker-2.3.19.jar–jsp
commons-fileupload-1.3.1.jar—-文件上传的包
commons-io-2.2.jar—-处理io流
commons-lang3-3.1.jar
commons-logging-1.1.3.jar–处理日志
这些包都可以到apache.org进行下载,版本不一定和这里说的一样,最好是保持只能高不能低。
2、在web.xml中配置核心拦截器。
1 2 3 4 5 6 7 8 |
<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> |
这里的filter-class是固定的,不可以改变,至于filter-name,只要保持上下一致,可以自行更改。url-pattern视自己的项目结构来定,一般都是/*,即拦截所有。
如果遇到Filter mapping specifies an unknown filter name strtus2这个错,在其他无误的情况下,一定是配置文件的名字出了问题。
3、配置如下的一个struts.xml文件,记住,一定要放在src目录下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- 该配置文件不需要重新部署 --> <constant name="struts.devMode" value="true"></constant> <!-- 改变默认编码 --> <constant name="struts.i18n.encoding" value="UTF-8"></constant> <!-- page包:是可以继承的 struts-default,获取struts2的默认功能,struts的默认命名空间是'/',即namespace="/",不需要指明--> <package name="struts2default" extends="struts-default"> <!-- action就是对应的类 name=login structs.LoginAction对应的类 class="structs.LoginAction"的意思是structs包下面的LoginAction类--> <action name="login*" class="structs.LoginAction"> <result name="success">/loginSuccess.jsp</result> <result name="fail">/login.jsp</result> <!-- result 跳转页面 request.getRequestDispather("/loginSuccess.jsp").for--> </action> </package> </struts> |
如果报No result defined for action …这样的错,说明方法中的返回值在struts.xml中未找到对应的的result,也就是方法的返回值和配置文件的result某一项不匹配。将其更改为一样即可。
4、在你的项目中定义一个类似如下的类,则一个简单的Struts2框架便搭建好了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
public class LoginAction { private String username; private String password; //类的入口方法 execute()一个Action类的默认方法 public String execute(){ System.out.println(username+"======"+password); return "success"; } //保存资源 public String save(){ System.out.println(username+"==="+password); System.out.println("保存资源文件进入这里了"); return "success"; } public String delete(){ System.out.println(username+"==="+password); System.out.println("删除进这里了..."); //No result defined for action structs2.LoginAction and result delete return Action.SUCCESS;//Action.SUCCESS默认是一个final的success } public String update(){ System.out.println("更新资料进入这里..."); return "success"; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } |
三、说一下注意点。
(1)定义一个命名空间时记得一定要以/开头,否则会找不到,命名空间之间可以继承,但被继承的最高命名空间必须继承struts-default。
(2)在一个命名空间下面不能配置相同的两个action,即name相同,不同的命名空间下可以,这样做的目的一是让业务逻辑更加清晰明了,而是当我们开发一些组件应用时,结构更加清晰。就像包与包的概念一样。
(3)继承空间可以访问被继承空间的name,但如果有相同的,则访问自己的,相当于子类继承父类的方法调用,但一般都是各自用各自的。
(4)当进行大型项目开发时,在一个xml中配置所有的action未免太臃肿,我们可以定义多个xml文件,每个xml文件配置一个功能的action,但其他的xml文件一定要在struts.xml中注册,只要都注册了,则注册顺序可不分先后,但如果要注册继承的xml时,被继承的xml一定要注册,注册方式为<include file=”xxx.xml”></include>。
对于struts2,总结以下原理就是:根据url到struts.xml找name,如果有和url匹配的name,就找到对应的类,调用对应的方法。
发表评论