大家都知道struts2默认处理后缀名为.action的请求,但有时想修改action的后缀名为.do,反复试了很多次总是报“There is no Action mapped for namespace "/" and action name...”,整了半天终于找到原因,特记录如下,希望其他童鞋不再落入此坑中....没有耐心的童鞋可以直接看最后一部分:重点说明。因为项目比较简单,此处只展示部分代码。
一、登录的jsp页面:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>SUMMER框架</title>
<script type="text/javascript">
function regist(){
document.forms[0].action="loginAction_regist.do";
}
</script>
</head>
<body style="text-align: center;">
<div align="center">
<form action="loginAction_login.do" method="post">
<table width="351" height="70" border="0" align="center" cellpadding="0" cellspacing="0">
<tr width="58" height="42">
<td>用户名</td>
<td>
<input type="text" name="username" value="">
</td>
</tr>
<tr height="42">
<td>密 码</td>
<td>
<input type="password" name="password" value="">
</td>
</tr>
<tr width="58" height="42">
<td>验证码</td>
<td>
<img alt="" src="<%=request.getContextPath() %>/verifyCodeServlet" οnclick="changeImg()"/>
</td>
</tr>
<tr width="58" height="42">
<td>
<input type="submit" value="登录">
</td>
<td>
<input type="submit" value="注册" οnclick="regist()">
</td>
</tr>
</table>
</form>
</div>
</body>
二、action类
public class LoginAction extends ActionSupport{
/**
*
*/
private static final long serialVersionUID = 7382518378920680649L;
private Logger log = Logger.getLogger(LoginAction.class);
private String username;
private String password;
private String errorMsg;
/**
* 登录验证
* @throws Exception
*/
public String login() throws Exception {
ActionInvocation invocation = ActionContext.getContext().getActionInvocation();
invocation.addPreResultListener(new PreResultListener() {
@Override
public void beforeResult(ActionInvocation invo, String resultName) {
log.info("返回的逻辑视图名是:" + resultName);
}
});
if(username.equals("admin") && password.equals("123456")){
log.info(username + "登录成功");
return "loginSuccess";
}else if( !username.equals("admin")){
//return "notAdmin";
throw new BaseException("baseException---用户名不为admin");
}else{
log.error(username + "登录失败");
errorMsg = username + "登录失败";
return "loginFailed";
}
}
/**
* 新用户注册
*/
public String regist() {
return "registSuccess";
//return SUCCESS;
}
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 getErrorMsg() {
return errorMsg;
}
public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
}
}
三、struts.xml配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<constant name="struts.devMode" value="true" />
<constant name="struts.i18n.encoding" value="utf-8"/>
<constant name="struts.i18n.reload" value="true"/>
<constant name="struts.action.extension" value="do"/>
<constant name="struts.configuration.xml.reload" value="true"/>
<package name="user" namespace="/" extends="struts-default">
<action name="loginAction_*" class="com.summer.action.LoginAction" method="{1}">
<result name="loginSuccess">/WEB-INF/jsp/index.jsp</result>
<result name="loginFailed" >/pages/login.jsp</result>
<result name="registSuccess">/pages/regist.jsp</result>
</action>
</package>
</struts>
<filter>
<filter-name>struts</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts</filter-name>
<!-- <url-pattern>/*</url-pattern> -->
<url-pattern>*.do</url-pattern>
</filter-mapping>
重点说明:
1、web.xml中:
<url-pattern>*.do</url-pattern>
当然也可以配置成:
<url-pattern>/*</url-pattern>
2、struts.xml中:
<constant name="struts.action.extension" value="do"/>
<action name="loginAction_*" class="com.summer.action.LoginAction" method="{1}">
action的name属性值不要带后缀.do,我之前就是在这里出了问题;
3、访问的action的URL必须以.do结尾,以JSP页面为例:
<form action="loginAction_login.do" method="post">