动态方法调用(在请求的时候,再明确具体的响应方法,配置的时候不明确):
LoginAction类中有两个方法some和second
1. 动态方法的调用(修改常量struts.enable.DynamicMethodInvocation):
1 <struts> 2 <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant> 3 <package name="demo" namespace="/test" extends="struts-default"> 4 <action name="login" class="com.tongji.actions.LoginAction"> 5 <result name="some">/some.jsp</result> 6 <result name="second">/second.jsp</result> 7 </action> 8 </package> 9 </struts>
html路径请求时使用 login!some.action 这种格式。
2. 使用通配符定义的Action:
1 <struts> 2 <package name="demo" namespace="/test" extends="struts-default"> 3 <action name="login_*" class="com.tongji.actions.LoginAction" method="{1}"> 4 <result name="some">/some.jsp</result> 5 <result name="second">/second.jsp</result> 6 </action> 7 </package> 8 </struts>
html路径请求时使用 login_second.action 这种格式。
Action接收请求参数:
1. 属性驱动方式:
指服务器段接收来自客户端的离散数据的方式。用户提交的数据,Action原封不动的进行逐个接收。该接收方式要求,在Action类中定义与请求参数同名的属性,即定义该属性的set方法。这样就能够使Action自动将请求参数的值赋予同名属性。
2. 域驱动方式:
指服务器端以封装好的对象方式接收来自客户端的数据方式。将用户提交的多个数据以封装的方式进行整体提交。该方式要求,表单提交时,参数以对象属性的方式提交。而Action中要将同名的对象定义为属性(为其赋予getter和setter)。这样请求将会以封装好的对象数据形式提交给Action。
Action中定义:
1 private Student student; //域属性,即对象属性 2 3 public Student getStudent() { 4 return student; 5 } 6 7 public void setStudent(Student student) { 8 this.student = student; 9 }
表单提交时:
用户名:<input type="text" name="student.name"/><br>
年龄:<input type="text" name="student.age"/><br>
页面获取参数时:
name = ${student.name}<br>
age = ${student.age}<br>
3. 集合数据接收:
指以集合对象方式接收数据。此情况与与域驱动接收数据原理是相同的。注意,必须是集合,不能是数组,因为数组不能自动扩展。
Action中定义:
1 private List<Student> students; 2 3 public List<Student> getStudents() { 4 return students; 5 } 6 7 public void setStudents(List<Student> students) { 8 this.students = students; 9 }
表单提交时:
用户名:<input type="text" name="students[0].name"/><br>
年龄:<input type="text" name="students[0].age"/><br>
页面获取参数时:
name = ${students[0].name}<br>
age = ${students[0].age}<br>
4. ModelDriven方式:
ModelDriven接收请求参数运行背后使用了Struts2的核心功能ValueStack。Struts2的默认拦截器中存在一个拦截器ModelDrivenInterceptor。当一个请求经过该拦截器时,在这个拦截器中,首先会判断当前调用的Action对象是否实现了ModelDriven接口。如果实现了这个接口,则调用getModel()方法,并把返回值压入ValueStack栈顶。
1 public class LoginAction implements ModelDriven<Student> { 2 private Student student; 3 4 public String execute() { 5 return "success"; 6 } 7 8 @Override 9 public Student getModel() { 10 if (student == null) { 11 student = new Student(); 12 } 13 return student; 14 } 15 }
表单提交时:
用户名:<input type="text" name="name"/><br>
年龄:<input type="text" name="age"/><br>
页面获取参数时:
name = ${name}<br>
age = ${age}<br>