注:本文是在看过黎活明老师的视频前2章后写下的。
Struts2是在webwork2基础上发展而来的,struts2属于MVC框架。
?
Struts2相对于struts1的优点:
1,struts2提供了拦截器,利用拦截器可以进行AOP(Aspect Oriented Programming)编程,实现如权限拦截等功能。
2,struts2提供了类型转换器,我们可以把特殊的请求参数转换成需要的类型。在strut1中,如果要实现同样的功能,就必须向struts1的底层实现BeanUtil注册类型转换器才行。
3,提供了支持多种表现层技术,如jsp,freemarker
4,输入校验可以对指定方法进行校验
5,提供了全局范围,包范围和Action范围的国际化资源文件管理实现
?
搭建开发环境:
1, 找到所需的jar文件
Jar文件在官网可以下载:http://struts.apache.org/
??? 根据所需下载相应的版本,下载struts-x.x.x-all.zip即可,解压后,在lib下可以找到以下的jar文件。
???????? struts2-core-2.x.x.jar:struts2框架的核心类库
???????? xwork-2.x.x.jar:xwork类库,struts2在其上构建
???????? ognl-2.6.x.jar:对象图导航语言,struts2框架通过其读写对象的属性
???????? freemarker-2.3.x.jar:struts2的ui标签的模板使用freemarker编写
???????? commons-logging-1.1.x.jar:ASF出品的日志包,struts2框架使用这个日志包来支持log4和jdk1.4+的日志记录
???????? commons-fileupload-1.2.1.jar:文件上传组件,2.1.6版本后必须加入此文件
2,编写配置文件
在src下新建xml文件:struts.xml
Xml文件内容如下:
??? <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
??? "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
??? "http://struts.apache.org/dtds/struts-2.0.dtd">
</struts>
3,在web.xml中加入struts2mvc框架启动配置
修改/WebRoot/WEB-INF/web.xml文件:
??? <filter>
??????? <filter-name>struts2</filter-name>
??????? <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
??? </filter>
??? <filter-mapping>
??????? <filter-name>struts2</filter-name>
??????? <url-pattern>/*</url-pattern>
??? </filter-mapping>
在struts1中,struts框架是通过servlet启动的,而在struts2中,struts框架是通过filter启动
注意事项:在struts2读取到struts.xml的内容后,以javabean的形式存放在内存中,以后struts对用户的每次请求处理将使用内存中的数据,而不是每次都读取struts.xml
war文件解压:jar xvf *.war(在官网下载的压缩包里面有4个war文件,解压后是4个例子)
?
通过以上操作,一个struts2的环境就搭建好了。
?
包的介绍:
struts.xml配置中的包介绍:在struts.xml中是可以配置多个包
<package name="sue" namespace="/test" extends="struts-default">
<action name="helloworld" class="com.action.HelloWorldAction" method="execute">
?<result name="success">/WEB-INF/page/hello.jsp</result>//视图名称,定义视图路径
?</action>
</package>
使用包来管理action,包的作用和java中的类包是非常相似的,它主要用于管理一组业务功能相关的action,在实际应用中,我们应该把一组业务功能相关的action放在同一个包下。在一个package中,是可以定义多个action的。(这样相对struts1可以减少重复的代码)
配置包时必须制定name属性,该name可以任意取名字,name主要供继承使用
但是必须是唯一的,它不对应java类包。如果其它包要继承该包,必须通过该属性进行引用,包的namespace属性用于定义该包的命名空间,命名空间作为访问该包下action的路径的一部分,如访问上面例子的action,访问路径为:
/test/helloworld.action
namespace属性可以不配置,默认命名空间为""(空字符串)
?
通常每个包都应该继承struts-default包,因为struts2很多核心的功能都是拦截器实现(请求数据的获取,文件上传,数据校验)的,struts-default定义了这些拦截器和result类型,可以这么说,当包继承了struts-default,才能使用struts2提供的核心功能
struts-default包是在struts2-core-2.x.x.jar文件中struts-default.xml中定义
struts-default.xml也是struts2默认配置文件,struts2每次都会自动加载struts-default.xml(抽象包)文件
?
包还可以通过abstract=“true”定义为抽象包,抽象包中不能包含action
只能被其他包继承
?
?
?
第一个例子:
在struts.xml文件中配置如下的package:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
??? "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
??? "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
?? ?<package name="sue" namespace="/test" extends="struts-default">
??????? <action name="helloworld" class="com.struts2.action.HelloWorldAction" method="execute">
??????????? <result name="success">/WEB-INF/page/hello.jsp</result>
???? ???</action>
??? </package>
</struts>
?
建的包名为sue,命名空间为test,继承了包struts-default,action名为helloworld,class路径为包com.struts2.action,下的类HelloWorldAction,方法为execute,返回字符串为:success,执行action后跳转的页面是/WEB-INF/page/下的hello.jsp文件。(放在web-inf文件下的原因是:在该路径下,客户端是无法看见的,具体的原因我也不太清楚)
访问此action的路径为:/test/helloworld.action
?
Package创建好后,在src下创建包,包名为:com.struts2.action,在此包中新建java文件,名字为:HelloWorldAction,文件内容为:
package com.struts2.action;
?
public class HelloWorldAction {
??? private String message;
???
??? public String getMessage() {
?????? return message;
??? }
?
??? public void setMessage(String message) {
?????? this.message = message;
??? }
?
??? public String execute(){//action返回值要求必须是String类型
?????? message = "我的第一个struts";
?????? return "success";
??? }
}
?
?
在文件/WEB-INF/下创建page文件夹,在page文件夹下新建jsp,名字为hello:
在<body></body>标签中加入一句代码如下:
? <body>
??? This is my JSP page. <br>${message }
? </body>
?
将此项目加载到tomcat下,启动tomcat后,在浏览器的访问路径为:
http://localhost:8080/struts2/test/helloworld.action
?以上为第一个例子
?
期间遇到的问题:访问路径最后的后缀为:.action
我在配置好后,一直提示请求路径是无效的,后来才发现少了后缀
?
附件为第一个例子的代码