Struts2基础
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts2基础相关的知识,希望对你有一定的参考价值。
1、Struts2是基于MVC的Web应用框架(模型、视图、控制)
一个请求在Struts2框架中的处理大概分为以下几个步骤
(1)、客户端初始化一个指向Servlet容器(例如Tomcat)的请求
(2)、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)
(3)、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action FilterDispatcher是控制器的核心,就是mvc中c控制层的核心。
(4)、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy
(5)、ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类 ,这里,我们一般是从struts.xml配置中读取。
(6)、ActionProxy创建一个ActionInvocation的实例。
(7)、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
(8)、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是, 也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper
2、Struts2=Struts1的知名度和市场+WebWork的技术
3、Struts是Apache下的顶级项目(Apache世界上最大的开源组织)
实现MVC模式,结构清晰
丰富的标签(tag [视图层])
通过配置文件页面导航,便于后期维护
与Servlet API松耦合,便于测试
4、Struts2主要目录
apps :该文件夹下包含了基于Struts2的示例应用
docs:该文件夹下包含了Struts2的相关文档,包括Struts2的快速入门、Struts2的文档以及API文档等内容
lib :该文件夹下包含了Struts2框架的核心类库,以及Struts2的第三方插件类库
src :该文件夹下包含了Struts2框架的全部源代码
5、Struts2搭建所需jar包
commons-fileupload-1.3.1.jar:Struts文件的上传和下载
commons-io-2.2.jar:文件读取
commons-lang3-3.1.jar:为java.lang包提供扩展
freemarker-2.3.19.jar:FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具
ognl-3.0.6.jar:支持ognl表达式
javassist-3.11.0.GA.jar:分析、编辑和创建JAVA字节码的类库
struts2-core-2.3.16.3.jar:Struts2的核心包
xwork-core-2.3.16.3.jar:xwork的核心包
asm-*.jar 类似javassits
log4j-1.2.17.jar 日志类库
type filter text---> MyEclipse配置快捷提示struts-2.3.30\src\core\src\main\resources\struts-2.3.dtd 到xml catalog uri
(导入jar包--->创建Struts.xml文件--->配置web.xml--->创建action)
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<!-- name package 唯一标识 -->
<!-- action class默认com.opensymphony.xwork2.ActionSupport -->
<!-- 默认方法execute -->
<package name="default" namespace="/" extends="struts-default">
<action name="hello" class="com.opensymphony.xwork2.ActionSupport" method="execute">
<!-- result 默认值 success -->
<result name="success">path.jsp</result>
</action>
</package>
</struts>
struts2-core-2.3.16.3.jar——>org.apache.struts2——>default.properties
<constant name="struts.devMode" value="true" />(开发者模型)
<constant name="struts.i18n.encoding" value="utf-8"></constant>(字符编码)
<constant name="struts.configuration.xml.reload" value="true"></constant>()
6、创建Action
普通的Java类,编写public String execute(){}方法
public class HelloAnction {
String houseType;
String resultPage;
public String getHouseType() {
return houseType;
}
public void setHouseType(String houseType) {
this.houseType = houseType;
}
public String getResultPage() {
return resultPage;
}
public void setResultPage(String resultPage) {
this.resultPage = resultPage;
}
public String execute(){
if(resultPage.equals("1")){
resultPage="oneHouse.jsp";
}else{
resultPage="otherHouse.jsp";
}
return "success";
}
}
实现Action接口,重写execute()方法
public class HelloAnction2 implements Action {
public String execute() throws Exception {
return "success";
}
}
继承ActionSupport类,重写execute()方法(推荐使用)
public class HelloAnction3 extends ActionSupport {
@Override
public String execute() throws Exception {
return "input_page";
}
public String add() throws Exception {
return "add_page";
}
public String login()throws Exception {
return "login";
}
}
7、Struts2基于MVC的Web应用框架
将请求和展现分开
8、Action
控制业务逻辑
如果业务逻辑很复杂,可以把业务逻辑构建为业务类,在Action中调用业务类
返回结果字符串
方便的处理数据
比如:Action中以属性方式接收用户数据
(1)Action接收参数方式一
Action接收参数(属性方式)
控制业务逻辑
表单参数名称必须在Action中有对应的setter以及getter方法
(必须得到set、get方法,应为stru2是通过反射去赋值)
解决乱码
修改struts.xml,添加代码<constant name="struts.i18n.encoding" value="编码格式" />
页面显示
<%@taglib uri="/struts-tags" prefix="s"%>
<s:property value="属性名"/>
应用场景
接收的参数字段个数少的时候适合使用,比如对于搜索应用,接收用户输入的搜索条件
public class LoginAction extends ActionSupport {
//必须得到set、get方法,应为stru2是通过反射去赋值
private String loginName;
private String loginPwd;
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
public String getLoginPwd() {
return loginPwd;
}
public void setLoginPwd(String loginPwd) {
this.loginPwd = loginPwd;
}
@Override
public String execute() throws Exception {
System.out.println(loginName+":"+loginPwd);
if("admin".equals(loginName)){
return SUCCESS;
}else{
return "fail";
}
}
}
(2)Action接收参数方式二
Action接收参 数(JavaBean方式):将模型数据从Action中分离了出来定义实体类,为实体添加属性以及setter和gettercom.pb.entity.User
为Action添加实体属性以及setter和getter
User user
修改表单参数name为实体对象名.属性名
<input type="text" name="user.userName"/>
取值通过<s:property value=“对象名.属性名”/>的形式
<s:property value="user.userName"/>
public class JavaBeanAction extends ActionSupport{
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String execute() throws Exception {
if(user==null){
return "login";
}
if(user.getLoginName().equals("admin")){
return "admin";
}else if(user.getLoginName().equals("common")){
return "common";
}else{
return "login";
}
}
}
(3)Action接收参数方式三
ModelDriver方式,Action实现ModelDriven接口,重写方法getModel();Action中要提供JavaBean类型的属性,需要实例化,但不需要相应的setter和getter方法
public class ModelDrivenAction extends ActionSupport implements ModelDriven<User> {
private User user=new User();
public User getModel() {
return user;
}
@Override
public String execute() throws Exception {
if(user==null){
return "login";
}
if(user.getLoginName().equals("admin")){
return "admin";
}else if(user.getLoginName().equals("common")){
return "common";
}else{
return "login";
}
}
}
符:使用动态方法调用(需要把 struts.enable.DynamicMethodInvocation 设为true)
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<constant name="struts.configuration.xml.reload" value="true"> </constant>(tomcat不需要重启)
9、使用method属性
访问Action时,默认调用的是execute()方法
可以在Action中定义多个业务方法
方法签名要与execute( )方法相同
public class HouseAction extends ActionSupport {
public String add() {
return "success";
}
public String update() {
return "success";
}
配置多个<action>标签
method属性指定调用的方法
<action name="house_add" class="com.pb.web.action.HouseAction" method="add">
<action name="house_update" class="com.pb.web.action.HouseAction"
method=“update">
10、动态方法调用
DMI(dynamic method invocation)
一个Action类中可以有多个业务方法
public class HouseAction extends ActionSupport {
public String add() {
return "success";
}
public String update() {
return "success";
}
}
只需要配置一个<action>标签
不需要使用method属性
<action name="house"class="com.pb.web.action.HouseAction">
调用时指出Action名和业务方法
http://localhost:8080/struts2/house!add
<result>的name属性
public String add() throws Exception {
return "addSuccess";
}
public String update() throws Exception {
return "updateSuccess";
}
<action name="house" class="com.pb.web.action.HouseAction" >
<result name="addSuccess">/houseAddSuccess.jsp</result>
<result name="updateSuccess">/houseUpdateSuccess.jsp</result>
</action>