在文件当中
<constant name="struts.devMode" value="true" />是当该文件的mapping修改时,不用重启服务器,即可生效。devMode开发模式。
/********过滤器类的源代码在Struts2的src/core/src/main/java当中,选中项目,右键properties,*****/
建立jar文件对应的源码D:\tool\struts-2.3.4包\struts-2.3.4\src\core\src\main\java文件夹。右击文件夹,properties。。。
Javadoc location:
<package name="default" namespace="/" extends="struts-default">
<action name="myjsp" class=””>
<result>
/index.jsp
</result>
</action>
</package>
1、Namespace决定了action的访问路径,默认为””,可以接收所有的action;这种情况下http://localhost:8080/项目名/sadoxyz/jsdaufo/salfh/index.action也是可以的;其负责处理其他action处理不了的action。
也可以写为”/”,或者”/xxx”,/xxx/yyy,相应的action访问路径为/index.action,/xxx/index.action,/xxx/yyy/index.action。
Namespace最好用模块来命名。即action的name和namespace是一样的。
2、struts.xml里面的package是用来防止action重名的,和java里的package作用一样。
<result name=”success”>/Hello.jsp</result>里面的result默认为success,可以不写。
3、注意拷贝一个项目的时候,要更改一个东西,右键properties,myeclipse,web,将Web Context-root的名字改成和新项目的名字一样,如“/test”。
4、引入其他项目,右键import,General,Existing Projects into Workspace,选择next,在select root directory中选择项目,记住要选择copy projects into workspace。Ok.
注意jre可能出现问题,重新部署。
5、具体试图的返回可以根据用户自己定义的Action来决定。通过返回的字符串找到对应的配置项,来决定视图的内容;
具体的Action的实现可以是一个普通的java类,里面有public String execute(),或者实现Action接口,不过开发过程当中,最常用的是继承ActionSupport类,好处是可以直接使用struts2封装好的方法。
6、路径问题:
Struts2中是根据action的路径而不是jsp的路径来确定,所以,如果指定了相对位置,可能会报错,尽量都使用绝对位置,可以用下面的代码来获取绝对路径的前面部分:
<%String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>(该部分放到头文件中)
在使用时,可以写成:
<a href=”<%=basePath%>index.jsp”> index.jsp</a>
或者:在head部分加上标签<base href="<%=basePath%>"/>,则<a href=”index.jsp”> index.jsp</a>直接就可以用。
这两种方法都需要将上面2句话放在头文件里。
注意:虽然可以用redirect方式解决,但是redirect方式并非必要。
7、DMI(动态方法调用):
AddMethod.java中没有execute(),只有public String Add() { return SUCCESS; },可以在struts.xml中,改成:
<package name="user" namespace="/user" extends="struts-default">
<action name="user" class="example.AddMethod">
<result>/example/AddMethod.jsp</result>
</action>
</package>
浏览器中输入http://localhost:8080/test1/user/user!Add可调用该方法。
8、方法调用:
同样是调用该方法,可以使用
<action name="userAdd" class="org.hualang.actionmethod.ActionMethod" method="add">
<result>/MyJsp.jsp</result>
</action>
来使用,浏览器中输入http://localhost:8080/test1/user/userAdd即可。
9、通配符的使用:
记住:约定优于配置。
系统匹配最精确匹配的action;包含*的属于同一等级,系统按照先后顺序。
<action name="*_*" class="cn.itcast.struts2. example.{1}Method" method="{2}">
<result>/example/{1}_Method.jsp</param>
</result>
</action>
假设调用的是Add_Method.java和Add_Method.jsp页面。
10、用Action的属性接受参数:
<a href="user/user!add?name=aaa&age=8">添加用户</a>
a.定义:在Action类中定义属性,创建get和set方法;
b.接收:通过属性接收参数,如:name; struts2中是通过方法来获取参数。
c.发送:使用属性名传递参数,如:user!add?name=aaa;
UserAction.java
package com.zby.struts2.user.action;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport{
//定义了两个属性name和age,使用get和set两个方法来设置和获得属性值
private String name;
private int age;
public String add(){
System.out.println("name="+name);
System.out.println("age="+age);
return SUCCESS;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
struts.xml:
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<package name="user" extends="struts-default" namespace="/user">
<action name="user" class="com.zby.struts2.user.action.UserAction">
<result>/user_add_success.jsp</result>
</action>
</package>
11、用Domain Model接收参数:(最常用)
<a href="user/user!add?user.name=a&user.age=8">
OR http://localhost:8080/test1/user/user!add?user.name=a&user.age=8
在这里我们可以直接使用 user对象+”.”+属性名 进行传值。其他的工作struts都会帮助我们完成的。Struts首先会new一个Action对象,然后new一个User对象user,我们在Action中只是声明了此对象,struts会自动帮我们赋值的。然后会调用对应的user的set方法,并且将值赋给它们。这样我们就可以使用了。
Action类:
public class UserAction extends ActionSupport {
private User user;
public String add() {
System.out.println("name=" + user.getName());
System.out.println("age=" + user.getAge());
return SUCCESS;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
这里使用到了User类:(其实就是一个javabean)
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
12、用ModelDriven接收参数:
a.定义:Action实现ModelDriven泛型接口,定义Model类的对象(必须new),通过getModel方法返回该对象;
b.接收:通过对象的属性接收参数,如:user.getUserName();
c.发送:直接使用属性名传递参数,如:user2!add?userName=MGC;
http://localhost:8080/test1/user/user1!add?name=a&age=8
Action.java:
public class UserAction1 extends ActionSupport implements ModelDriven<User>{
private User user=new User();
public String add(){
System.out.println("name:"+user.getName());
System.out.println("age:"+user.getAge());
return SUCCESS;
}
@Override
public User getModel() {
return user;
}
}
13、解决中文乱码问题:
在struts.xml头文件中加入 <constant name="struts.i18n.encoding" value="GBK" />这条语句。
Struts2.1.7以前的不行,这个是bug。可以将filter改成2.0版本的修正这个bug,或者用spring的filter来修改这个bug。
14、struts.xml头文件中的常量可以在struts_default.properties里面查看。
15、简单数据验证:
使用addFieldError方法和s:fieldError标签简单处理数据校验
浏览器中输入:http://localhost:8080/test1/user/user2!add?name=a
(1)struts.xml中添加语句:
<action name="user2" class="example.UserAction2">
<result>/example/UserAction.jsp</result>
<result name="error">/example/UserAddError.jsp</result>
</action>
(2) UserAction2.java中:
public String add() {
if (name == null || !name.equals("admin")) {
this.addFieldError("name", "name is error");
this.addFieldError("name", "name is not good");
return ERROR;
}
return SUCCESS;
}
(3) UserAddError.jsp中重要语句:
<%@taglib uri="/struts-tags" prefix="s" %>
<body>
<!-- 以固定的css样式取出错误信息,不方便我们进行相应的处理-->
<s:fielderror fieldName="name" theme="simple"/>
<!-- 从存储错误信息的Map中拿数据 -->
<s:property value="errors.name[0]"/>
<!-- 显示详细的栈信息-->
<s:debug></s:debug>
</body>
16、通用标签:
(1)<s:property value=”abc” default=”name” escape=”true” />
value的值是Object属性,所以解析的时候会当成OGNL表达式来处理,会取参数,参数为null时取default里面的值;如果想在value里面就放一个string的话,需要写成” ’abc’ ”的形式。Escape默认为true,不解析value里面的html元素。
(2) set一般用来给给一些常用的长string赋个名字,方便使用。Var里面的值放到actionContext里面。
<li>set 设定adminName值(默认为request和 ActionContext): <s:set var="adminName" value="username" /></li>
<li>set 从request取值: <s:property value="#request.adminName" /></li>
<li>set 从ActionContext取值: <s:property value="#adminName" /></li>
Value的值是Object属性,struts2文档有问题。Id和name已经废弃了,不需要用。
Set有5个范围application, session, request, page, or action.默认为action。
<%--<li>set 设定范围: <s:set name="adminPassword" value="password" scope="page"/></li>
<li>set 从相应范围取值: <%=pageContext.getAttribute("adminPassword") %>
</li>--%>
<li>set 设定var,范围为ActionContext:
<s:set var="adminPassword" value="password"scope="session"/></li>
<li>set 使用#取值: <s:property value="#adminPassword"/> </li>
<li>set 从相应范围取值: <s:property value="#session.adminPassword"/> </li>
这些结果可以相应的动手做实验得到结论。
(3)<s:bean name=”com.tc.Dog” var=”myDog”>
<s: param name=”name” value=”’lucy’”>
</s:bean>
bean的执行过程中,会new一个Dog类的对象,放到栈里面。Var是用来确定要不要放到actionContext里面的。
在bean里面的name对应java文件,里面有name属性,这个是和param里面的name对应;var是参数名字,因为id属性已经废弃不用了;而var里面的value是可以将参数lucy传到bean里面的,不过,要加’ ’。
如果要取值,有var的话,在actionContext里面也可以有, <s:property value="# myDog.name "/>。
如果没有var的话,在bean里面写:
)<s:bean name=”com.tc.Dog” >
<s: param name=”name” value=”’lucy’”>
<s:property value=”name "/>
</s:bean>
(4)<s:include value=”/index.html”/>包含静态文件(容易在中文时出现问题)
使用%号:
<s:set var=”incPage” value=”’/index.html’”/>
<s:include value=”%{#incPage}”/>
里面的%{}强制将里面的内容转换成OGNL表达式,这个是通用的。
(5) $ # %的区别
a) $用于i18n和struts配置文件
b) #取得ActionContext的值
c) %将原本的文本属性解析为ognl,对于本来就是ognl的属性不起作用