Struts2 总结

Struts2 框架

主讲:李洪鹤

以下笔记均为我本人亲自整理,若有描述不对或代码错误,请同学们及时更改一下,重新上传上去,谢谢!

1.

2. 3. 4. 5. 6. 7. 8. 9. 10. 11.

Struts是基于MVC的轻量级框架。 1、实现了MVC。

2、轻量:侵入性,与量级成正比。

3、框架:代码的主体结构,减少开发工作量。 复习MVC:经典的架构模式。 为什么选择Struts?

1、健壮性:框架的稳定性。2.1.8 4* 2、易用性:好用、好学。 4* 3、扩展性:未来。 5*

4、侵入性:事物之间的关联程度,要求多寡。 4* 低耦合度 管理

? Struts2发展史

Struts1:Apache,简单、小巧。20%+

耦合度比较高,与jsp/servlet关系紧密,发展遇到瓶颈。 WebWork:技术先进,XWork。 Struts2:以XWork为核心。

面试题:Struts1和Struts2的区别和联系?

1、Struts2与Struts1的区别很大,不能理解为Struts1的升级版。2、Struts2以XWork为核心,可以理解为WebWork的升级版。

? 步骤:

<struts>

<package name="helloworld" namespace="/day01" extends="struts-default"> <action name="hello" class="com.tarena.action.HelloAction" method="execute">

Struts2总结

<result name="success">/WEB-INF/jsp/welcome.jsp</result> <result name="error">/WEB-INF/jsp/error.jsp</result>

</action>

</package>

</struts>

例:<!-- http://localhost:8080/struts01a/day01/hello.action --> 在web.xml文件配置中 注意:

<filter>

<filter-name>Struts2</filter-name>

<filter-class>

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class>

</filter>

注入:根据属性进行匹配,来对JavaBean

设置值得方式。

class XXAction {

输入属性;

输出属性;

}

CMMI5:软件成熟度模型,从1-5级,5级是最高等级。

1、前端控制器FC

2、Action:处理业务流程

3、ValueStack值栈:存放值的容器

4、Result输出

5、Interceptor拦截器:进行扩展

6、Tags标签

<s:property value="name"/>

<s:iterator value="feeList">

<s:property value="name"/>

</s:iterator>

<s:debug/>

<s:property />

? EL表达式取值顺序

page

request

ValueStack

session

application StrutsRequestWrapper

struts2 6大核心组件:

FC、Action、ValueStack、 Interceptor、Result、Tags

? Action基本原理:

1、请求提交控制器; 2、根据配置找Action; 3、创建VS栈容器; 4、实例Action放栈顶; 5、调用Action算输出; 6、历经层层拦截器; 7、根据Action返回值; 8、调用Result做输出。

? 一个功能实现 操作步骤:

1、创建Web Project 2、导入类库

3、配置前端控制器web.xml 4、配置struts.xml

5、创建Action类:AddUserAction 6、创建要执行的方法:execute

7、根据需求,创建输入属性、输出属性 8、写Action的execute方法 1)写DAO: a)创建IUserDao接口,加方法add b)创建UserDaoImpl实现类,实现接口IUserDao c)写UserDaoImpl的方法add d)测试一下刚写的方法

2)写DAO工厂:创建DAOFactory类, 在里面加方法getUserDAO(),

并返回UserDaoImpl实例(new UserDaoImpl())

3)调用DAOFactory.getUserDAO()得到接口IUserDao, 调用接口的add方法来实现需求(业务逻辑), 计算输出属性,并赋值给输出属性,

判断一下应该返回的字符串(success,error...), 好与Result匹配 9、写页面:adduser.jsp

Struts2总结

Struts2总结

关于struts2.xml文件 通配符:

需求描述:模块-用户,增加、修改、删除、查询的功能

定义关键字: 模块user,增加add,修改modify,查询query 原始版:

Struts2总结

<struts>

<package name="user" namespace="/user" extends="struts-default">

增加: <action name="addUser" class="com.tarena.action.UserAction" method="add">

<result name="success"> /WEB-INF/user/adduser.jsp </result>

</action>

修改:<action name="modifyUser" class="com.tarena.action.UserAction" method="modify"> <result name="success"> /WEB-INF/user/modifyuser.jsp</result>

</action>

查询:<action name="queryUser" class="com.tarena.action.UserAction" method="query">

<result name="success"> /WEB-INF/user/queryuser.jsp</result>

</action>

</package>

</struts>

进阶版:

<struts>

<package name="user" namespace="/user"

extends="struts-default">

action的name不同,规律:动作名+模块名

class不同,规律:com.tarena.action.+(动作名+模块名)Action.

jsp名称不同,规律:动作名+模块名.jsp

第一个*代表模块名user

第二个*代表动作名add/modify/query

第三个*代表jsp的名

<!-- 假设Action类名为UserAction,

有方法add,

jsp名为adduser.jsp

http://localhost:8080/netctoss/user

/User_add_adduser.action

要访问哪个动作,就要知晓是哪个Action及方法,

找{1}、{2}、{3},把括号替换成对应的关键字,

以_连接拼action的name-->

<action name="*_*_*" class="com.tarena.action.{1}Action" method="{2}">

<result name="success"> /WEB-INF/user/{3}.jsp</result>

</action>

</package>

</struts>

? Result基本原理

Result有不同的类型,每种类型对应一个类,这些类都实现同一个接口Result。

在struts.xml: Dispatcher: 默认 redirectAction:重定向 json :

Action中不指定class的时候, 默认为ActionSupport类,若不指定method时,默认为execute方法。 以某种特定的格式向浏览器输出。

Struts2总结

三、复习:转发和重定向到区别

1、转发:

a)地址不变 b)1次请求 c)当请求一个组件A,A执行完之后,没结束, 需要调用另一个组件B才能结束请求.

2、重定向:

a)地址更变 b)2次请求 c)当请求一个组件A,A执行完之后,请求结束。 通知系统,自动做下一次的请求B

四、复习JQuery

1、$("#imageCode") 选择器

2、$("#imageCode").text("abc");

3、$(function(){ //当页面加载完毕后,调用此function

}); 五、使用json类型的Result 1、导入类库 2、修改package的继承,改为json-default 3、为这种Result注入root参数

Struts2总结

Action给Result提供输入流,Result创建输出流,

输出到界面,输出流需要接Action传递来的输入流

<action name="image" class="......ImageAction"> <result name="success" type="stream"> <param name="inputName">imageStream</param> </result> </action> ? 拦截器Interceptor: 1、是struts2扩展Action的机制 2、做一些系统级通用的业务逻辑 如:记录日志、控制权限、控制事务 3、Interceptor的使用步骤 a)创建拦截器组件,实现Interceptor接口 b)在struts.xml注册这个拦截器 c)在struts.xml中,给action指定拦截器 d)若Action中引用了自定义的Interceptor, 那么默认的Interceptor就不会执行。 4、使用方式 定义拦截器组 :interceptors

定义拦截器:

Struts2总结

interceptor

定义拦截器栈:interceptor-stack

引用拦截: interceptor-ref

使用Struts2默认的拦截器来做文件上传:

首先 需要包commons-io-1.3.2.jar

<!-- 改变Struts2上传文件的最大限制 -->

<constant name="struts.multipart.maxSize" value="5000000"></constant> <package name="demo" namespace="/demo" extends="struts-default"> <!-- 转到上传页面的Action -->

<action name="toUpload">

<result name="success">/WEB-INF/upload.jsp</result>

</action>

<!-- 上传文件Action -->

<action name="upload" class="com.tarena.action.UploadAction"> <interceptor-ref name="fileUpload">

<!-- 改变Action上传文件的限制 -->

<param name="maximumSize">2000000</param>

</interceptor-ref>

<interceptor-ref name="basicStack"></interceptor-ref>

<result name="success">/WEB-INF/ok.jsp</result>

<result name="error">/WEB-INF/error.jsp</result>

</action>

</package>

//在Action方法中 需继承ServletContextAware 类 续写setServletContext方法 public class UploadAction implements ServletContextAware{

private File some; // 输入属性

private String someFileName;

private ServletContext ctx;

..........略 get set方法

public String execute() {

if(some == null) {

return "error";

}

// 1、根据输入属性,构建存储的路径,指定上传文件名

String name = "upload_" + someFileName;

String path = "upload/" + name; //构建一个相对路径

// 根据相对路径,去构建绝对路径

path = ctx.getRealPath(path);

System.out.println("PATH:" + path);//打印 看效果

// 2、根据存储的路径,将输入属性复制到路径下

FileUtil.copy(some, new File(path));// FileUtil 此类 已事先写好 return "success";// 3、返回特征字符串,找Result

}

} public void setServletContext(ServletContext sc) { ctx = sc; }

? 使用Struts2的思路:

1、需求:做一个用户模块,包含查询、增加、修改、删除。

2、分析需求:

模块名:User

功能名:find, add, modify, delete

3、开始写struts.xml

--先配置查询功能的Action

a)包名、namespace都是以模块名来命名,即user。

b)配置Action:Action名称以"功能+模块"命名:findUser, Action类名以"功能+模块Action"命名:FindUserAction。 c)为Action配置Result,根据Action返回值的不同,

Result可能有多个:

Result的name要跟页面展现的种类有关。

jsp文件所在文件夹以模块命名:user,

jsp文件以"功能+模块.jsp"命名:findUser.jsp。

--经过a、b、c三个步骤之后,

查询的Action即findUser配置好了。

在重复这3个步骤,去配置增加、修改、删除的Action。

4、写Action:根据配置文件中定义的Action类来写:

a)创建Action类:FindUserAction,增加对应的方法execute b)定义输入属性、输出属性

c)写Action调用的方法

--1、获得输入属性

--2、根据输入属性,调用DAO(去写DAO),做运算 --3、把运算结果赋值给输出属性

--4、返回字符串,要与struts.xml中

该action的Result的name对应

5、经过第4步,FindUserAction写好了。

重复第4步,写AddUserAction,ModifyUserAction,DeleteUserAction

6、在WEB-INF下创建文件夹user

7、创建findUser.jsp,并且写这个jsp

8、重复第6、7步,写addUser.jsp, modifyUser.jsp

相关推荐