手打struts知识点
Posted guoDaXia的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手打struts知识点相关的知识,希望对你有一定的参考价值。
Struts2概论
1、MVC原理
MVC(Model-View-Controller),程序设计理念
视图不用多说,html、jsp等
控制器,中转站,分配各个组件应当做什么,接受参数并跳转其他处理 servlet、action
模型
Struts中的ActionFrom一集业务JavaBean实现。对表单数据进行封装,与页面表单交互并传递数据;JavaBean用于处理真正的业务请求
2、产生
Struts+webWork
3、结构体系
客户端发送请求-->web.xml中的StrutsPrepareAndExecuteFilter-->struts.xml-->action-->result.jsp(或者其他action等等)
Struts2环境配置
1、lib中导入jar文件
我使用的是Struts2.3.24,9个jar
struts2-core-2.1.24.jar
xwork-core.2.1.6.jar
ognl-2.7.3.jar
commons-logging-1.0.4.jar
freemarker-2.3.15.jar
commons-io-1.3.2.jar
commons-fileupload-1.2.1.jar
javassist-3.11.0.GA.jar
commons-lang3-3.2.jar
2、web.xml中配置过滤器
过滤器的名为struts2,class路径为
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
3、src下面新建struts.xml
格式:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant ......../>
...
<package>
...
</package>
</struts>
Action对象
1、Actionj接口
public interface Action{
public static final String SUCCESS="success";
public static final String NONE="none";
public static final String INPUT="input";
public static final String LOGIN="login";
public static final ERROR="error";
public String execute() throws Exception;
}
主要说明一下INPUT常量,当struts经过validate验证失败的时候,系统自动返回INPUT,所以会在result页面中寻找name为INPUT的属性
2、创建Action对象
可以直接创建一个class,然后实现Action接口,实现execute()方法
创建一个class,继承自ActionSupport类,只需要在该类中实现execute()即可。建议使用,因为ActionSupport是一个经过了考验的规范class,它实现或者继承了validate等多个接口,使用它可以简化我们的开发。
3、请求参数的注入
在Struts2框架中,表单的提交的数据会自动注入到与Action对象相对应的属性。它与Spring框架中的IoC的注入原理相同,通过Action对象为属性提供setter方法注入
要求:
jsp中表单的name属性与Action中对应的属性的setter方法对应。要注入属性值的Action对象,必须为该属性提供setXXX()方法,因为Struts2的内部实现是按照JavaBean规范中提供的setter方法,自动为属性注入值
所以一般在Action中注入的属性的属性名与表单对应控件的name值相等,且该属性提供getXXX()、setXXX()方法
域模型DomainModel
我们使用有相同点的属性都喜欢把它封装,这样比较结构化,简单明了。第一种方式注入请求参数在参数过多的情况下可能造成action中的代码过多
将一些属性信息封装成一个实体对象的属性。操作领域对象的方法,在Action对象中引用某一实体对象,并且http请求的参数值可以注入到实体对象的属性上,这种方式i就是struts2提供的DomainModel的方式
注意:使用域模型的时候,jsp中的表单空间的name属性应该与Action中的对象和bean中的属性对应,格式为 对象.属性 ,例如:user.name
View Codepublic Class User{ private String name; private String password; private int age; public void setName(String name){this.name=name;} public String getName(){return name;} public void setPassword(String password){this.password=password;} public String getPassword(){return password;} public void setAge(int age){this.age=age;} public int getAge(){return age;} } public Class UserAction extends ActionSupport{ private User user; public void setUser(User user){this.user=user;} public User getUser(){return User;} public String execute() throws Exception{ return "success"; } } <body> <s:form action="userAction" method="post"> <s:textfield name="user.name" label="用户名"/> <s:password name="user.password" label="密码" /> <s:textfield name="user.age" label="年龄"/> <s:submit value="注册"/> </s:form> </body>
驱动模型ModelDriven
在域模型DomainModel中,虽然struts2的Action对象可以通过直接定义实例对象的引用来调用实体对象进行相关的操作,但要求的参数必须是指定参数对应的实体对象,例如上李忠需要指定参数名称为user.name这种形式,有点不方便
驱动模型不需要指定参数所属的对象引用。Struts2的API中,提供了一个名为ModelDriven的接口,Action对象可以通过实现此接口获取指定的实体对象,获取的方式是实现ModelDriven提供的getModel()方法进行获取,其语法格式为: T getModel();
处理流程
Struts2实例化Action对象,判断Action对象是否实现ModelDriven接口,如果实例化了该接口,就会调用getModel()获得实体对象模型并将其返回。后面就可以直接使用该对象的属性了。
View Codepublic Class User{ private String name; private String password; private int age; public void setName(String name){this.name=name;} public String getName(){return name;} public void setPassword(String password){this.password=password;} public String getPassword(){return password;} public void setAge(int age){this.age=age;} public int getAge(){return age;} } public Class UserAction extends ActionSupport implements ModelDriven{ private User user; @Override public User getModel(){ return this.user; } public String execute() throws Exception{ return "success"; } } <body> <s:form action="userAction" method="post"> <s:textfield name="name" label="用户名"/> <s:password name="password" label="密码" /> <s:textfield name="age" label="年龄"/> <s:submit value="注册"/> </s:form> </body>
4、Action中方法的调用
一般的,执行Action默认执行其execute()方法,但是如果将所有的控制层代码都写在execute方法中,并不是特别理想,复用性,修改难。
所以我们希望可以走Action中的其他方法
静态方法调用:
在Struts.xml中的Action标签中有method属性,可以指定进入Action的时候调用的方法,使用该方法替换execute()的作用
动态方法调用
Dynamic Action(动态 Action)
处理方式是通过请求Action对象中的一个具体的方法来实现动态的操作。具体的操作方式是通过在强求的Action的URL地址后加上请求字符串(方法名称),与Action中的方法进行匹配。例如:/userAction!add 请求userAction的add方法
struts2默认支持动态方法调用,如果需要关闭,可以在struts.xml设置常量:
name="struts.enable.DynamicMethodInvocation" value="false"/>
动态Action的应用demo(只代码未测试):
demo主要代码,部分删减 public class UserAction extends ActionSupport{ private String info; public String add() throws Exception{ info="添加用户信息"; return "add"; } public String update() throws Exception{ info="更新用户信息"; return "update"; } public String getInfo(){ return info; } public void setInfo(String info){ this.info=info; } } struts.xml: <struts> <package name="myPackage" extends="struts-default"> <action name="userAction" class="com.action.UserAction"> <result name="add">user_add.jsp</result> <result name="update">user_update.jsp</result> </action> </package> </struts> user_add.jsp: <body> <font color="red"> <s:property value="info"/> </font> </body> user_update.jsp: <body> <font color="red"> <s:property value="info"/> </font> </body> index.jsp: <body> <a href="userAction!add">添加用户</a> <br/> <a href="userAction!update">更新用户</a> </body>
Struts2的配置文件:
struts-default.xml 位于struts2-core-2.3.24.jar的.org.apache.struts2包中
struts-plugin.xml 位于struts提供的各个插件的包中
struts.xml Web应用默认的struts2配置文件在src目录下
struts.properties Struts2框架中属性配置文件,也位于src目录下
web.xml 在该文件中也可以设置Struts2的一些信息
struts搜索信息的顺序为从上到下,如果在前面声明了一个常量后面再此声明会将其覆盖掉
struts2的包配置
类似java中的包,提高可读性,简化java工作
<package name="user" extends="struts-default" namespace="/user">
......
</package>
package的属性以及说明
name 声明包的名称,以方便在其他处引用此包,此属性必须
extends 用于声明继承包,也就是它的父包
namespace 指定命名空间,也就是访问此包下的Action需要访问的路径
abstract 将包声明为抽象类型(包中不定义Action)
命名空间设置
在JavaWeb开发中Web目录通常以模块进行划分,录用户的首页可以定义在"/user"目录中,其访问地址为"/user/index.jsp"。Struts2命名空间指定一个Action的访问路径,它的使用方法是通过配置文件struts.xml的包声明中,使用namespace属性进行声明
<struts> <package name="book” extends="struts-default" namespace="/bookmanager"> ...... </package> </struts>查找action的顺序:
现在指定package中查找,然后在同一个struts.xml中的其他package中查找,再在它的父包中查找,全部找不到才报错404
Action相关配置
Struts2中的Action是一个控制器的角色
<action name="userAction" class="com.action.UserAction" method="save"> <result>/success.jsp</result> </action>
action中元素的属性以及说明
name 用于配置Action对象被请求的URL地址
class 指定Action对象的类名
method 指定请求Action对象时调用哪一个方法
converter 指定Action类型转化器的类
使用通配符实现简化配置
struts2的通配符有两个:*表示0个或多个字符;\表示转义字符
<struts> <package name="myPackage" extends="struts-default" namespace="/"> <action name="*_*" class="com.action.{1}Action" method="{2}"> <result name="success">/{2}.jsp</result> </action> </package> </struts>通配符的优先级:
(1)如果struts.xml里面有对应的action name .就算它有其他通配符匹配的,都优先对应完全相同的.
比如 有一个 action name 是 "user_add" 还有一个是 "user_*" .现在,来一个请求是 "user_add.action " .那么,它会优先匹配"user_add " ..其实,这个很好理解..
(2)如果一个action name对应于两个带通配符的action name 那么,需要看这个配置谁在前面.它匹配写在前面的
比如 有一个 action name 是 "*_*" 还有一个是 "user_*" .现在,来一个请求是 "user_add.action " .那么,它会优先匹配写在前面的...
任何带"*"的action name 优先权都是一样的...不是说带一个"*"的优先权就比带两个"*
" 的高.
Struts2的开发模式
1、实现与servletAPI的交互
ActionContext对象的一些方法:
public static ActionContext getContext()
public Object get(Object key)
public Map getSession()
public Map getApplication()
Struts2中提供了Map类型的request、session与application,可以从ActionContext对象中获得。ActionContext对象位于com.opensymphony.xwork2包中,它是Action执行的上下文,其常用API如下:
实例化ActionContext: 使用ActionContext对象的getContext()方法得到ActionContext的实例化对象。getContext()是静态方法可直接调用
ActionContext context=ActionContext.getActionContext();获取Map类型的request,使用ActionContext对象的get()方法获取
Map request=ActionContext.getContext().get("request);获取session也可以在get()里面获取,但是ActionContext也特意留了获取session的方法getSession()
application也与session类似
Map session=ActionContext.getContext().getSession(); Map session1=ActionContext.getContext().get("session"); Map application=ActionContext.getContext().getApplication(); Map application1=ActionContext.getContext().get("application");
以上是关于手打struts知识点的主要内容,如果未能解决你的问题,请参考以下文章