struts2 学习小记(2)

1) struts.xml
<constant name="struts.devMode" value="true" />
struts.devMode : 是否设置为开发模式 true:是开发模式,否则不是
注:在开发模式下,修改Struts的配置文件后不需要重新启动Tomcat服务器即生效。
否则修改Struts配置文件后需要重新启动Tomcat服务器才生效。

Namespace
Namespace决定了action的访问路径,默认为“”,可以接收所有路径的action,如果没有找到相应的namespace时,则使用namespace为空的action
Namespace可以写为/,或者/xxx,或者/xxx/yyy,对应的action访问路径为/index.action、/xxx/index.action、或者/xxx/yyy/index.action.
Namespace最好也用模块来进行命名。

<package>标签
<package>是用来解决重名的问题,例如当系统的前台和后台都有一个action名叫hello,这时就需要用package来区分。 前台<package name="front">后台<package name="back">

2)
<constant name="struts.devMode" value="true" />
    <package name="front" extends="struts-default" namespace="/">
        <action name="index" class="com.bjsxt.struts2.front.action.IndexAction1">
            <result name="success">/ActionIntroduction.jsp</result>
        </action>
</package>
注:<action>标签中的class属性是表示action的对应的类(这个类是一个普通Java类),当访问这个action时会创建这个类成为一个对象,然后执行这个对象中的execute方法()(execute方法返回类型为String)。

当<action>标签中class属性省略时,则默认执行com.opensymphony.xwork2.ActionSupport类中的execute方法,而这个方法返回一个字符串常量SUCCESS(常量值为:”success”).

有三种手段实现Action:
第一种:Action 普通Java类
第二种:Action 实现com.opensymphony.xwork2.Action接口,这个接口中定义了一些常量和一个execute方法,我们重写execute()方法就可以了。
第三种:Action 继承com.opensymphony.xwork2.ActionSupport类,而这个类又实现了com.opensymphony.xwork2.Action接口,我们重写execute()方法就可以了。
注:第三种Action是我们需要使用的方式,因为这个类不担实现了com.opensymphony.xwork2.Action接口,更重要的是它已经帮我封装了许多其它有用的方法。

3)路径问题的说明
struts2中的路径问题是根据action的路径而不是jsp路径来确定,所以尽量不要使用相对路径。
虽然可以用redirect方式解决,但redirect方式并非必要。
解决办法非常简单,统一使用绝对路径。

还有另一种方式,就是在<head>标签中,指定<base>标签值,这样就使用统一绝对路径。
<%
String path = request.getContextPath();//
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<head>
<base href="<%=basePath%>" />
…………
注:<base>标签:当前页面中所有连接都会在前面加上base地址。


4)Action的动态调用方法
1、方法一(通过methed属性指定执行方法):
可以在配置文件中配置Action的时候用method=来指定执行哪个方法

2、动态方法调用DMI(推荐)
可以在url地址中动态指定action执行那个方法。Url地址如下:
http://localhost:8080/Struts2_0500_ActionMethod/user/user!add
方法:action + ! + 方法名
注:只要Action对象中有这个方法,并且返回类型为String就可以调用。
这样Struts.xml配置文件中不需要配置methed属性。

5)Action通配符(wildcard)的配置
使用通配符,将配置量降到最低, 不过,一定要遵守"约定优于配置"的原则
1、 通配符
星号(*)  表示所有
{数字} 表示第几个通配符
例如:Student*  那么{1}代表第一个星号(*)
*_* 那么{1}代表第一个星号(*) ,{2}代表第二个星号(*)


6)Action的属性接收参数
Action中三种传递并接受参数:
1、在Action添加成员属性接受参数
Action对象中添加成员属性并生成set、get方法。
2、域模型(Domain Model)
就是利用对象域来进行传递和接受参数
例如请求的URL地址:
http://localhost:8080/Struts2_0800_DomainModelParamInput/user/user!add?user.name=a&user.age=8
其中,访问的是namespace=”/user” action的name=”user” Action所执行的方法method=”add”
利用对象域user来传递参数,为对象的属性赋值(user.name=a user.age=8)
注:需要一个对象user 并且这个对象需要有两个成员属性,且具有get、set方法。
然后在Action中添加一个User对象的成员属性。并且有get、set方法,就可以了。
3)ModelDriven接收参数
使Action实现com.opensymphony.xwork2.ModelDriven<User>(在实现接口时需要使用泛型,否则使用时需要转型)中利用其getModel()方法返回对象模型,从而获得传入的参数。
例如URL如下:
http://localhost:8080/Struts2_0900_ModelDrivenParamInput/user/user!add?name=a&age=8
其:访问的是namespace=”/user” action的name=”user” Action所执行的方法method=”add”,其传入了两个参数:name=a,age=8。
参数被传入至Action后,会被ModelDriven对象根据参数名自动赋值给User对象相应的属性而生成User对象,并且由getModel()返回。那么我们在Action中就可以利用这个对象了。
注意:传入的参数名需要与对象模型中的成员属性一致。

7)Action属性接收参数中文问题
如果表单提交数据中有中文时,尽量使用post方式。
需要在Struts.xml配置文件中加入一个常量配置,如下:
<constant name="struts.i18n.encoding" value="GBK" /><!-- internationalization -->
但是,在Struts2 2.7之前,这个配置无效,需要其它方法设置。如下:
手动在web.xml中在Struts过滤器之前配置一个过滤器用于解决中文的问题。

8)简单数据验证
使用addFieldError方法和s:fieldError标签简单处理数据校验。
根据配置文件可以得知action所对应的类为com.bjsxt.struts2.user.action.UserAction,并且具有两个结果集(success和error).代码如下:
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
private String name;
public String add() {
if(name == null || !name.equals("admin")) {
//addFieldError 添加错误信息,可以在客户端访问到。
this.addFieldError("name", "name is error");
this.addFieldError("name", "name is too long");
return ERROR;
}
return SUCCESS;
}

<%@taglib uri="/struts-tags" prefix="s" %>
<s:fielderror fieldName="name" theme="simple"/>

你可能感兴趣的:(Web,struts)