14通配符问题
其实这个问题看一个例子就ok
<package name="actions" extends="struts-default" namespace="/">
<action name="Student*" class="com.bjsxt.struts2.action.StudentAction" method="{1}">
<result>/Student{1}_success.jsp</result>
</action>
<action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}">
<result>/{1}_{2}_success.jsp</result>
</action>
</package>
例如当我访问 http://localhost:8900/BJSXT_struts2/Teacher_delete
struts就会匹配第二个action,name里面有两个* 很清楚的 第一个*对应着Teacher第二个*对应这个delete
那么要找到类就是com.bjsxt.struts2.action.TeacherAction
调用的方法就是上面那个类的里面的delete方法
返回调用的jsp就是 Teacher_delete_success.jsp
第一个Student*就不用说了吧
类如下
package com.bjsxt.struts2.action;
import com.opensymphony.xwork2.ActionSupport;
public class TeacherAction extends ActionSupport {
public String add() {
return SUCCESS;
}
public String delete() {
return SUCCESS;
}
}
项目图如下
其中Studentadd_success.jsp 里面就显示"添加学生成功" 其余三个类似
15-17 action接受参数
有三种方式
第一种
url 如此写 http://localhost:8900/BJSXT_struts2/user/user!add?age=15&name=a
struts.xml如下
<package name="user" extends="struts-default" namespace="/user">
<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
<result>/user_add_success.jsp</result>
</action>
</package>
类如下
package com.bjsxt.struts2.user.action;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
private String name;
private int age;
public String add() {
System.out.println("name=" + name);
System.out.println("age=" + age);
return SUCCESS;
}
}
//省略get/set方法
第二种方法
url如下
http://localhost:8900/BJSXT_struts2/user/user!add?user.name=a&user.age=8
package com.bjsxt.struts2.user.action;
import com.bjsxt.struts2.user.model.User;
import com.opensymphony.xwork2.ActionSupport;
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;
}
}
//省略get/set方法 User类也就是两个属性 及相应的getset方法也不再赘述
struts.xml不变
这里就出现了一个问题 如果我给User这个类里面加上一个参数或两个参数的构造函数会怎么样呢?
大家可以自己试试 会报如下的错
java.lang.InstantiationException: com.bjsxt.struts2.model.User
InstantiationException 实例化错误!!
奇怪了 如果我把构造函数都去掉 由一切ok
问题就是 我们忘掉了关于构造函数最基本的几个知识点
当一个类没有构造函数的时候 编译器会自动为它增加一个参数为空 内部什么都不写的构造函数
如果我们给类加了构造函数 那么编译器就不管了
而struts是通过无参的构造函数来实例化user这个对象的 你自己写了构造函数 让struts情何以堪??
所以两个解决方案 要么去掉加上的构造函数 要么就再加一个无参的构造函数
另一方面如果user里面的参数和传过来的参数数目不匹配 可以加上一个UserDto类做中间转换
第三种方法的url和struts.xml与第一种的一样
不一样的是类
package com.bjsxt.struts2.user.action;
import com.bjsxt.struts2.user.model.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class UserAction 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;
}
}
这里有三个要注意的地方
1:实现了ModelDriven接口,(要写清楚类型!)
2user对象要初始化
3要有getModel的方法.
其实最经常用的是第二种方法 第一种与第三种方法用的较少 但是我们应该明白三种方法的内部原理