动态方法与通配符可以压缩代码,使相同的类中不同方法共用同一个标签,通过不同方法返回的逻辑视图(即方法返回的字符串)的不同来实现跳转到不同的action或页面,但是由于动态方法调用中前端URL的固定格式,会导致后台数据架构泄露,所以不用推荐使用,通配符方式相对来说更加安全,方便
- 通配符
通配符使用时在<action>
标签的name
属性值上使用*
来代表调用哪个方法以及跳转页面等,可以使用多个*
号,由于是多个方法共用同一个action
,所以方法返回的字符串不能相同,否则会造成混乱,method
的属性值是根据前端页面的url地址来区别的,前端页面中把方法名写到第?
个*
号的位置,在method
方法的值中就写{?}
xml配置文件
<action name="*User" class="action.Login" method="{1}">
<result name="Login_SUCCESS" type="chain">${nextAction}</result>
<result name="Login_error">/struts2Jsp/login.jsp</result>
<result name="Logout_success">/struts2Jsp/login.jsp</result>
</action>
前端页面
<form action="loginUser.action" method="post">
用户名:<input onfocus="ts('tsxx')" type="text" name="user.name" ><br>
密码:<input onfocus="ts('tsxx')" type="password" name = "user.password"><br>
<span id="tsxx">${ts}</span><br>
<input type="submit" value="登录">
</form>
后台java方法
public String login(){
if(user.getName().equals("aaa") && user.getPassword().equals("123")){
System.out.println(user.getName());
System.out.println(user.getPassword());
// 转发action中要跳转到的action名称
nextAction="logoutUser";
msg="hello";
return "Login_SUCCESS";
}else{
msg="用户名或密码错误!";
return "Login_error";
}
}
- 动态方法
动态方法调用作用与通配符作用差不多,在action
标签中不配置method
属性,方法名是通过类似于参数的方法传递的,中间用!
分割
xml配置文件
<action name="user" class="action.Login">
<result name="Login_SUCCESS">/zhuce.jsp</result>
<result name="Login_error">/struts2Jsp/login.jsp</result>
<result name="Logout_success">/struts2Jsp/login.jsp</result>
前端页面
<form action="user!login.action" method="post">
用户名:<input onfocus="ts('tsxx')" type="text" name="user.name" ><br>
密码:<input onfocus="ts('tsxx')" type="password" name = "user.password"><br>
<span id="tsxx">${ts}</span><br>
<input type="submit" value="登录">
</form>
后台java方法
public String login(){
if(user.getName().equals("aaa") && user.getPassword().equals("123")){
System.out.println(user.getName());
System.out.println(user.getPassword());
// 转发action中要跳转到的action名称
nextAction="logoutUser";
msg="hello";
return "Login_SUCCESS";
}else{
msg="用户名或密码错误!";
return "Login_error";
}
}