struts2重点.docx
《struts2重点.docx》由会员分享,可在线阅读,更多相关《struts2重点.docx(30页珍藏版)》请在冰豆网上搜索。
struts2重点
Struts2
Struts2大纲:
1、MVC及流行MVC框架简介;
2、配置基于Struts2的登陆和HelloWorld程序;
3、Struts2基础;
4、深入Struts2配置文件;
5、Struts2的类型转换;
6、Struts2拦截器;
7、国际化;
8、输入校验;
9、Struts2标签;
10、AJAX支持及与其他常用技术整合;
11、Struts2下的文件上传
项目开发:
实现Struts2下的注册和登陆模块(对比JSP+JavaBean+Servlet模式体会Struts2的优点);
实现Struts2下的BBS系统;
实现Struts2下的在线考试应用系统;
一、MVC模式
1.1、Model1模式
1.2、Model2模式
小型Web应用可以用Model1来开发;虽然Model2模式提供了良好的扩展性和可维护性,但增加了前期开发成本。
1.3、MVC模式优点
1、业务逻辑和数据显示分离;PHP(SMARTY模板).NET(CLASS和一个页面)
2、应用被分为三层,降低了耦合性;
3、更符合软件工程化的精神,不同的层各司其职,有利于通过工程化管理代码。
有利于代码的复用及组件化。
1.4、常用MVC框架
1、Struts1.x和Struts2.x
2、Webwork
3、SUN的JSF
4、Tapestry
5、SpringMVC
1.5、Struts2处理流程图
Struts2处理流程如下:
1、浏览器发送请求,如login.action(struts2-*.action)(struts1-*.do);
2、核心控制器FilterDispatcher根据请求决定调用合适的action;
3、拦截器链自动对请求应用通用功能,如validation输入验证;
4、回调Action的execute方法,该方法先获取用户请求参数,然后调用业务逻辑组件如JavaBean处理用户请求;
5、Action的execute方法处理结果将输出到浏览器,可以是HTML、JSP,也可以是Velocity、Freemarker等其他模板技术;
从代码层面上看,Struts2需要新加的内容:
*.action(相当于servlet,可以有n个方法如增删改查,默认有个execute方法,根据页面过来的参数调用哪个方法)
result(视图层技术如jsp文件的映射,由struts.xml文件来配置)
struts.xml(struts核心配置文件,完成诸如定义action的映射路径,以及result的定义等功能)
二、初识Struts2——HelloWorld
实现目标:
地址栏输入http:
//localhost:
88/Struts2HelloWorld/helloworld.jsp,输入用户名,交由http:
//localhost:
88/Struts2HelloWorld/hello.action处理,返回到helloworld.jsp视图层,并显示刚才输入的值;
步骤:
1、MyElipse下新建一个叫struts2hello的web工程;
2、将struts2的jar包copy到WEB-INF/lib/目录下;
3、修改web.xml文件,配置Struts2的核心Filter;
struts2
org.apache.struts2.dispatcher.FilterDispatcher
struts2
/*.action
4、在src目录下增加struts.xml配置文件;
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEstrutsPUBLIC
"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"
"http:
//struts.apache.org/dtds/struts-2.0.dtd">
login.jsp
index.jsp
5、实现控制器
packagecom.app.hello;
importcom.opensymphony.xwork2.Action;
//POJO(PlainObjectJavaObject低侵入式)
publicclassUserWorldimplementsAction{
//获取页面上的控件,只需要要在这里注入对应的属性,提供setter和getter方法即可。
(名称要完全一样)
privateUseruser;
privateUserDAOuserDAO=newUserDAO();
//action默认执行方法
publicStringexecute(){
if(!
userDAO.login(user.getUsername(),user.getPassword())){
ActionContextac=ActionContext.getContext();
ac.put("msg","登陆信息有误");//request.setAttribute("",);
}else{
return"index";//转发到逻辑视图对应的页面
}
return"login";
}
publicUsergetUser(){
returnuser;
}
publicvoidsetUser(Useruser){
this.user=user;
}
//http:
//localhost:
8080/Struts2HelloWorld/hello!
aliasAction.action
publicStringaliasAction(){
name="";
return"success";
}
}
6、修改struts.xml文件,添加Action的映射和逻辑视图转向,在中添加如下内容;
/helloworld.jsp
7、添加JSP视图层,取名helloworld.jsp
<%@pagecontentType="text/html;charset=utf-8"%>
<%@taglibprefix="s"uri="/struts-tags"%>
<%@pageisELIgnored="false"%>
DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
SayHelloSay"Hello"to:
propertyvalue="name"/>${name}
formaction="hello">
Name:
textfieldname="name"/>
submit/>
form>
三、Struts2基础
3.1、核心控制器FilterDispatcher
FilterDispatcher是Struts2框架的核心控制器,该控制器作为一个Filter运行在Web应用中,它负责拦截所有的用户请求。
如果用户请求以*.action结尾,该请求将被转入struts2框架进行处理。
Struts2获得*.action请求后,将查找struts.xml文件的配置信息,改文件配置了action的name和class属性,其中name属性决定了该action处理哪个用户请求,而class属性决定了action的实现类。
Struts2用于处理用户请求的action实例,并不是用户实现的业务控制器,而是action代理——因为用户实现的业务控制器并没有与servletAPI耦合,显然无法处理用户请求。
而Struts2框架提供了系列拦截器,该拦截器负责将HttpServletRequest请求中的请求参数解析出来,传入到action中,并回调action的execute方法来处理用户请求。
3.2、业务控制器
业务控制器组件就是用户需要实现的Action类,该类包含一个execute方法,该方法返回一个字符串,字符串就是一个逻辑视图名——对应于一个JSP文件或其他视图层技术;
程序员实现完action后,需要在struts.xml配置action三个部分:
1、action处理的url;
2、action对应的实现类;
3、action里包含的逻辑视图与物理资源间的对应关系;
如:
/helloworld.jsp
/helloworld.jsp
3.3、模型组件
模型组建包括实体bean和业务逻辑bean,或其他J2EE组件,如EJB等技术;
3.4、视图组件
Struts2改变了Struts1只能使用JSP作为视图层技术的现状。
允许使用如Freemarker、Velocity等模板技术;每个action都有result子元素,定义逻辑视图名与物理资源的映射关系。
3.5、Struts2基本配置
3.5.1、配置web.xml
配置加载struts2标签库(如果web应用使用sevlet2.4以上的规范,无需配置因为它会自动加载标签库文件)
1、配置FilterDispatcher核心控制器类;
2、标签库;
需要把TLD描述文件COPY到WEB-INF/下;
/WEB-INF/tld/*.tld//TLD文件真实路径
/WEB-INF/tld/*.tld//引用位置
想在jsp文件使用该标签:
<%@tagliburi=””prefix=”s”%>
3.5.2、配置struts.xml
避免struts.xml文件过于臃肿,可以分拆成多个配置文件,然后包含进来;
//包含默认的xml文件
3.5.1、配置struts.properties属性文件
struts.properties应该放在WEB-INF/classes下,该文件包含了系列的key-value对象,每个key就是一个属性,对应的value就是值;
常见的key:
//设置web应用的默认编码,相当于request.setCharacterEncoding(“GBK”)
struts.i18n.encoding=GBK
//每次进来http请求时,是否重新加载国际化资源文件;开发阶段应该设为true,发布阶段为false
struts.i18n.reload=false
//定义国际化资源文件的baseName
struts.custom.i18n.resources=globalMessages
有时候开发人员不喜欢使用额外的struts.properties文件,也可以在struts.xml通过配置constant元素,一样可以配置属性:
--指定国际化资源文件的baseName-->
3.5.1、struts.xml文件结构
GBK
--全局逻辑视图的定义-->
/input.jsp
/input.jsp
四、深入Struts2
4.1、深入struts2.xml配置文件
4.1.1、常量配置
可以在struts.xml也可以在struts.properties文件配置属性;
Struts框架按照如下顺序加载常量:
struts-default.xml
struts.xml
struts.properties(可以把struts.xml文件里的constant部分丢过来,利于管理)
web.xml
若同名,后面的会覆盖前一个;
4.1.2、包配置
Struts2核心组件是Action和拦截器,struts2用包来管理它们。
每个包就是多个Action和拦截器的集合。
下例定义了一个default包,并继承struts默认的包:
http:
//localhost:
8080/项目名/hello.action
name属性:
必填,包名,改名字是被其他包引用的key;
extends属性:
可选,改包继承其他包,自动拥有对方的action和拦截器等;
namespace属性:
可选,定义包的命名空间;
abstract属性:
可选,值为true|false,若为true,则改包为抽象包,不能包含action定义。
4.1.3、命名空间配置NameSpace
考虑到同一个web应用需要同名的action,struts2以命名空间来管理action,同一个命名空间不能有同名的action,不同的命名空间可以有同名的action;
Struts2通过为包指定namespace属性来为包下的所有action指定共同的命名空间;
--配置Action和逻辑视图-->
/helloworld.jsp
--配置Action和逻辑视图-->
/helloworld.jsp
上例配置了两个包,admin包指定了/admin命名空间,也就是说它能处理
http:
//localhost:
88/Struts2HelloWorld/admin/hello.action下的所有URL请求;
对于default包,没有指定命名空间,那么默认它的命名空间是“”;
可以为包显示指定根命名空间为”/”;
如果请求为/barspace/bar.action,系统首先查找/barspace命名空间里名为bar的action,如果有,则调用改action处理请求,否则会去默认命名空间去找;若都找不到,系统会报错误;
4.1.4、包含配置
包含配置允许将一个struts.xml分拆成多个以便于管理;每个被包含的文件都是标准的struts2配置文件;
4.1.5、异常处理配置
在程序中出现异常可以尽管往外抛,由统一接口做页面处理
<%@pageerrorPage=”url”%>
在异常处理页中处理异常:
<%@pageisErrorPage=”true”%>
<%
try{}catch(Exceptione){}
%>
/error.jsp
这样抛出的异常java.lang.Exception由struts2处理,跳转到/error.jsp页面。
这个异常声明是全局的,也可以声明成局部的。
4.1.6、拦截器配置
拦截器允许在action处理请求之前或者之后,插入开发者自定义的代码;
详细请参考拦截器配置
4.2、Strus2的Action
4.2.1、实现Action
要点:
1、Struts2的Action属于低侵入式设计,不需要实现任何接口或者继承类。
也就是一个普通的POJO;
2、使用Action里的属性封装请求参数以及处理后的结果,对应给每个属性添加setXXX和getXXX方法;可以利用propertyvalue=”username”/>或者{$username}输出属性的值;可以封装任何类型,包括自定义的类、数字、集合类、MAP等数据类型;
3、可以实现Action接口或者继承ActionSupport类,以利用其中的方法,增强功能;
4.2.2、Action访问ServletAPI
Struts2提供了一个ActionContext类来访问ServletAPI,使用request、session、application对象;
publicStringexecute(){
//实例化ActionContext用来访问ServletAPI
ActionContextac=ActionContext.getContext();
if(getUsername().equals("tiger")&&getPw().equals("1")){
//获取application的count属性
Integercount=(Integer)ac.getApplication().get("count");
if(count==null)
count=1;
else
count++;
//设置application的count属性
ac.getApplication().put("count",count);
//设置session的username属性
ac.getSession().put("username","tiger");
//设置request的msg属性,相当于request.setAttribute(key,value)
ac.put("msg","你已成功登陆");
returnSUCCESS;
}else{
ac.put("msg","登陆失败");
returnLOGIN;
}
}
4.2.3、Action直接访问Servl