Action的定义方法: 模型,多实例单线程
1、不实现任何接口,不继承任何类(Object) 体现了Struts2框架的轻侵入性
publicclass MyAction{
publicString execute()throws Exception{}方法签名不能有任何修改
}
2、实现Acto你接口
5大常量
ERROR执行出错,跳转到错误处理页
INPUT跳转输入页
NONE执行没有任何问题,但是不跳转任何页面
SUCCESS执行正常,跳转到成功页
LOGIN跳转到登录页面
1个抽象方法
execute()
3、继承ActionSupport,推荐使用
支持Action接口,所以5大常量可以直接使用
支持服务器端数据校验
.addFieldError addActionError
支持国际化和本地化处理
为了实现类内高内聚,类间弱耦合,所以可以将一个实体的相关CRUD定义在一个Action类
自定义方法名,但是签名必须和execute类似,例如 public String add()throwsException{}
配置:
<action name="user_*"class="com.yan.UserAction" method="{1}">
*可以指代任意长度的任意字符,可以匹配user_add user_deluser_detail...
{1}表示和*匹配的具体内容,例如匹配user_add则{1}表示add
特殊定义<actionname="*_*" class="com.yan.{1}Action" method="{2}">
例如User_add.action第一个*表示User,第二个*表示add,则这个配置实际上就成了
<actionname="User_add" class="com.yan.UserAction"method="add">
这里注意User受字母大写
特殊定义<actionname="*">如果没有定义class属性,则默认class是ActionSupport,*可以匹配任何内容
<actionname="*">
<result>/{1}.jsp 表示使用abc.action不需要额外定义对应的Action类,直接跳转到同名的jsp
Action如何接收用户提交数据
1、属性驱动
页面<inputname="username"/>
Action类 private String username; 属性名称和提交参数的名称一致
如果需要则自动进行类型转换,如果转换失败则自动跳转input进行报错
2、模型驱动,实现一个ModelDriven接口
publicclass UserAction extends ActionSupport implements ModelDriven<UserBean> {
privateUserBean user=new UserBean();没有对应的get/set方法
publicUserBean getModel() {
returnuser;
}
}
页面<inputname="username"/> username对应user中的username属性
页面输入域名称对应模型中的属性名即可
3、对象驱动 严格来说这不是struts2提供的功能,是OGNL提供的功能
publicclass UserAction extends ActionSupport {
privateUserBean user=new UserBean();//可以new也可以不new,这里需要get/set方法
提交数据时应该为"对象名称.属性名"的方式,例如user.username=zhangsan&user.password=123456
提交数据的中文乱码问题:
常量配置struts.i18n.encoding=UTF-8,在Struts2中默认采用的是UTF-8编码字符集
解决方案1:所有的页面统一使用UTF-8编码,如果提交中文则使用post提交【推荐使用】
解决方案2:修改常量struts.i18n.encoding=GBK,并且多有页面统一GBK
服务器端编码数据校验: ---使用配置文件校验
1、场景1:
publicclass MyAction{
publicString execute()throws Exception{}
publicvoid validate(){this.addFieldError }
}
运行:首先创建MyAction对象,并执行对应的set方法注入请求参数,然后框架调用validate方法进行数据校验,
如果执行过程中使用addFieldError添加了报错信息,则自动转向到input对应的物理页面,不会执行execute方法.
要求:如果需要使用服务器端数据校验,则必须在struts.xml中配置<result name=input>
2、常见2:Action类中不仅仅只有execute方法
publicclass MyAction{
publicString add()throws Exception{}
publicvoid validateAdd(){}专门针对add方法的数据校验
publicString del()throws Exception{}
publicvoid validateDel(){}专门针对del方法的数据校验
}
如果既定义了execute方法,也有add之类的方法
定义方法1:public classMyAction{
publicString add()throws Exception{}
publicvoid validateAdd(){}专门针对add方法的数据校验,注意方法名称由"validate+对应调用的方法名"组成,注意方法名称首字母大写
publicString execute()throws Exception{}
publicvoid validate(){}
}
但是validate方法在执行当前类的所有方法之前都会被执行
定义方法2: 修改validate方法名称
publicclass MyAction{
publicString add()throws Exception{}
publicvoid validateAdd(){}专门针对add方法的数据校验
publicString execute()throws Exception{}
publicvoid validateExecute(){} 只针对execute方法的数据校验
}
publicclass UserAction extends ActionSupport implements ModelDriven<User> {
privateUser user = new User();
privateString repassword;
publicString add() throws Exception {
System.out.println(user);
returnLOGIN;
}
publicvoid validateAdd() {
if(user!=null){
if(user.getPassword()!=null&& user.getPassword().trim().length()>0)
if(!user.getPassword().equals(repassword))
this.addFieldError("repassword","两次输入口令不一致!");
}
}
如何打开页面时给输入域设置默认值
<s:radiolist="#{true:'男',false:'女'}" name="sex" label="性别"value="true"/>
建议:进入Action,然后在Action中设置默认值后跳转到输入页
publicclass UserAction extends ActionSupport implements ModelDriven<User> {
privateUser user = new User();
publicString toadd() throws Exception {
user.setUsername("包好龙");
user.setSex(false);
return"add";
}
<s:radiolist="#{true:'男',false:'女'}" name="sex" label="性别"/>自动回填
如何避免直接使用URL访问页面
WEB-INF文件夹是不允许直接访问,但是允许跳转。所以一般建议将页面存放在/WEB-INF/content/下
<resultname="add">/WEB-INF/content/user/add.jsp</result>
运行时常量配置 struts2-core.jar中/org/apache/struts2/default.properties
1、配置默认后缀
struts.action.extension=action,,
配置方法1: struts.xml
<?xmlversion="1.0" encoding="UTF-8"?>
<!DOCTYPEstruts PUBLIC
"-//ApacheSoftware Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<constantname="struts.action.extension" value="do,abc"/>
</struts>
2、配置开发模式
struts.devMode= false Struts2提供一个比较友好的报错显示页面
相当于配置struts.i18n.reload = true和struts.configuration.xml.reload = true
配置方法2:可以在web.xml中前端控制器上配置参数,也可以类似上面的配置,使用constant标签
` <filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>struts.devMode</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3、默认主题的常量设置
struts.ui.theme=xhtml定义默认主题
struts.ui.templateDir=template定义主题的文件夹
struts.ui.theme.expansion.token=~~~
struts.ui.templateSuffix=ftl默认使用Freemarker定义不同的显示
<constantname="struts.ui.theme" value="simple"/>
Struts2默认提供了4种视图技术: jsp freemarker velocity xslt
Struts2为了简化页面编写提供了2类标签库:UI标签库和非UI标签库
引入标签库:<%@taglib uri="/struts-tags" prefix="s"%>
引入标签库所使用的css和js文件<s:head/>
UI标签库: <form>
针对UI标签的显示效果,Struts2定义了4种主题:同时支持自定义主题
xhtml默认主题,使用css+table进行显示格式控制
css_xhtml使用css+div进行显示格式控制
simple使用简单格式
ajax提供了异步支持
<s:formaction="user_add.action">用于生成<formaction="user_add.action" method="post">
同时提供了报错信息的显示支持
<s:textfieldname="username" label="用户名称"/>用于生成对应的单行输入域<inputname="username" type="text"/>
<s:passwordname="password" label="用户口令"/>用于生成对应的单行密码域<inputtype="password" name="password"/>
<s:radiolist="#{true:'男',false:'女'}" name="sex" label="性别"/>用于生成radiobutton实现排他性选择
<s:submitvalue="提交数据"/>用于生成提交按钮,value就是按钮上的提示文本
<s:reset value="重置数据"/>用于生成重置按钮,value就是按钮上的提示文本
xhtml主题默认按钮的显示效果为一行一个按钮,按钮向右对齐
设置标签所使用的主题,控制按钮的显示效果
<tr><tdcolspan="2">
<s:submitvalue="提交数据" theme="simple"/>
<s:resetvalue="重置数据" theme="simple"/>
</td></tr>
OGNL:对象图导航语言,是一种功能强大的EL,允许调用方法
定义集合{元素1,元素2,...}
定义Map:#{key1:value1,key2:value2,....}