概述
查看上篇文章的struts.xml,文件中的两个<action>元素定义绝大部分相同,可见这种定义相当冗余。为了解决这个问题,Struts2还有另一种形式的DMI:使用通配符的方式。
在配置<action>元素时,允许在指定name属性时使用模式字符串(即使用“*”代表一个或多个任意字符),接下来就可以在class属性、method属性及<result>子元素中使用{N}的形式来代表前面第N个星号(*)所匹配的字符串。
login_register.jsp :
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<script type="text/javascript">
function register(){
var targetForm=document.forms[0];
targetForm.action="registerAction";
}
function login(){
var targetForm=document.forms[0];
targetForm.action="loginAction";
}
</script>
<form action="login_register" method="post">
姓名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="登录" οnclick="login();">
<input type="submit" value="注册" οnclick="register();">
</form>
</body>
</html>
ok.jsp :
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<%
Object obj=session.getAttribute("username");
if(obj==null){
response.sendRedirect("login_register.jsp");
}
%>
${loginInfo} ${registerInfo}<br>
welcome ${username}...
</body>
</html>
struts.xml :
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<package name="demo" extends="struts-default">
<action name="*Action" class="action.LoginRegister" method="{1}">
<result name="success" type="dispatcher">/ok.jsp</result>
<result name="login" type="redirect">/login_register.jsp</result>
</action>
</package>
</struts>
LoginRegister.java :
public class LoginRegister extends ActionSupport{
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String login(){
System.out.println("login...");
if(getUsername().equals("scott")&& getPassword().equals("tiger")){
ActionContext.getContext().getSession().put("username",getUsername());
ServletActionContext.getRequest().setAttribute("loginInfo","login success !");
return "success";
}
return "login";
}
public String register(){
System.out.println("register...");
if(getUsername().equals("scott")&& getPassword().equals("tiger")){
ActionContext.getContext().getSession().put("username",getUsername());
ServletActionContext.getRequest().setAttribute("registerInfo","register success !");
return "success";
}
return "login";
}
}
上面的代码说明了通配符的使用规则,至于其他情形,可以举一反三。
现在的问题是,当用户请求的URL同时匹配多个Action时,究竟由哪个Action来处理用户请求呢?
这里不写测试代码了,直接给出结论:如果有URL为abcAction的请求,而在struts.xml中有名为abcAction的Action,则一定由该Action来处理用户请求;如果struts.xml文件中没有名为abcAction的Action,则搜寻name属性值能匹配abcAction的Action,例如name为*Action或*,而 *Action 并不会比 * 优先匹配abcAction的请求,而是先找到哪个Action,就会由哪个Action来处理用户请求。
最后
以上就是苹果航空为你收集整理的Struts2(10):利用通配符实现DMI的全部内容,希望文章能够帮你解决Struts2(10):利用通配符实现DMI所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复