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">
<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.xml文件 通配符:
需求描述:模块-用户,增加、修改、删除、查询的功能
定义关键字: 模块user,增加add,修改modify,查询query 原始版:
<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方法。 以某种特定的格式向浏览器输出。
三、复习:转发和重定向到区别
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参数
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
定义拦截器:
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
1Struts2中Action通过什么方式获得用户从页面输入的数据又是通过什么方式把其自身的数据传给视图的Action从页面获取数…
1struts2步骤1创建web项目2添加struts2的必须jar包3添加支持配置webxml文件4创建界面和相应的action…
20xx年5月13日221312Struts2总结fdteamcaptain陈玉龙1Struts2的起源和背景Struts2以We…
Day1一框架概述1三大框架是企业主流JavaEE开发的一套架构Struts2SpringHibernate2什么是框架为什么要学…
Struts2框架主讲李洪鹤以下笔记均为我本人亲自整理若有描述不对或代码错误请同学们及时更改一下重新上传上去谢谢123456789…
Struts2标签库使用小结在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才…
1在action中定义的变量在jsp页面中显示用ltspropertyvaluequot变量名quotgt变量名2在页面中实现自动…
Struts2项目开发总结注Struts2版本Struts216数据库Oracle9i所须架包commonslogging104j…
Struts2项目开发总结注Struts2版本Struts216数据库Oracle9i所须架包commonslogging104j…
Struts2面试题1struts2工作流程Struts2框架本身大致可以分为3个部分核心控制器FilterDispatcher业…
Struts2框架培训日志92020xxStruts2框架培训日志Struts框架的起源Struts是在20xx年5月发布第一个版…