struts2 命名空间错误的问题

EHOME820 2012-03-02 01:14:42
大家好,我在学习<struts2权威指南>,途中遇到一个问题:就是namespace不对!
情况:
1,很多人说,jsp页面放在根目录不好,放在WEB-INF更加安全,所以我先在web.xml中,设置应用默认跳转到index.jsp。
2,从index.jsp跳转到WEB-INF/jsp下面的登录界面:
  <jsp:forward page="WEB-INF/jsp/login.jsp"/>

3,登录界面的请求表单:

<s:form id="loginForm" action ="loginAction">
<s:textfield name ="username" label="用户名"/>
<s:password name ="password" label ="密码"/>
<s:textfield name ="vercode" label ="验证码"/>
<s:submit value ="登陆"/>
<input type ="button" onclick ="jumpRegist();" value ="注册"/>
</s:form>

4,struts.xml的配置:

<package name="dg" extends="struts-default" >
<action name ="loginAction" class ="action.LoginAction" >
<result name ="input">WEB-INF/jsp/login.jsp</result>
<result name ="failure">WEB-INF/jsp/error.jsp</result>
</action>
</package>

5,结果就是,发布在tomcat上,有时候不能运行,提示错误:HTTP Status 404 - /loginregist/WEB-INF/jsp/loginAction.action
有时候可以运行,但是有警告:
警告: No configuration found for the specified action: 'loginAction.action' in namespace: '/WEB-INF/page'. Form action defaulting to 'action' attribute's literal value.
这个警告是说:namepace配置不对,可是我在package里面都没有配置namespace啊,默认就是“”的,怎么会出错呢?


...全文
488 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
也遇到,这个相关的问题。我没写namespace结果总是找不到404。后来把namespace="/"添加上,结果就好了。莫名其名的。url访问路径localhost:8080/项目名/namespace/action名 这样既可。
wjj_cadn 2013-04-04
  • 打赏
  • 举报
回复
学习了,不过为什么要用<s:form> 不直接用<form > 呢
EHOME820 2012-03-02
  • 打赏
  • 举报
回复
这个还是没用,可能是浏览器问题,还是新版本的struts不稳定吧,这回的url又变成了
http://127.0.0.1:8080/loginregist/loginAction

,总之状态不稳定,应该不是人为的问题。
暗夜螃蟹 2012-03-02
  • 打赏
  • 举报
回复
最终版



<struts>
<!-- 开发模式,每次更改配置或者代码后,不用重启服务器 -->
<constant name="struts.devMode" value="true" />
<!-- 允许struts动态请求,只是调用struts里面的某个方法 -->
<constant name = "struts.enable.DynamicMethodInvocation" value = "true"/>

<!-- 空间名为/WEB-INF/page -->
<package name="deng" extends="struts-default" >
<!-- 配置全局result -->
<global-results>
<result name ="success">WEB-INF/jsp/sucess.jsp</result>
<result name ="exception">WEB-INF/jsp/error.jsp</result>
</global-results>
<!-- 配置全局的异常印射 -->
<global-exception-mappings>
<exception-mapping result="exception" exception="java.lang.Exception"/>
</global-exception-mappings>
<!-- 配置loginAction,registAction,使用通配符配置 -->
<action name ="loginAction" class ="action.LoginAction" >
<result name ="input">WEB-INF/jsp/login.jsp</result>
<result name ="failure">WEB-INF/jsp/error.jsp</result>
</action>
<action name ="registAction" class ="action.RegistAction">
<result name ="input">WEB-INF/jsp/login.jsp</result>
<result name ="failure">WEB-INF/jsp/error.jsp</result>
</action>
<!-- 这个是跳转页面用的,比如我跳转regist.jsp,那么只要请求是regits就可以了。 -->
<action name="*.jsp">
<result>WEB-INF/jsp/{1}.jsp</result>
</action>
</package>

<package name="web_inf_page" extends="deng" namespace="/WEB-INF/page" />


</struts>





暗夜螃蟹 2012-03-02
  • 打赏
  • 举报
回复
是这样



<struts>
<!-- 开发模式,每次更改配置或者代码后,不用重启服务器 -->
<constant name="struts.devMode" value="true" />
<!-- 允许struts动态请求,只是调用struts里面的某个方法 -->
<constant name = "struts.enable.DynamicMethodInvocation" value = "true"/>

<!-- 空间名为/WEB-INF/page -->
<package name="deng" extends="struts-default" >
<!-- 配置全局result -->
<global-results>
<result name ="success">WEB-INF/jsp/sucess.jsp</result>
<result name ="exception">WEB-INF/jsp/error.jsp</result>
</global-results>
<!-- 配置全局的异常印射 -->
<global-exception-mappings>
<exception-mapping result="exception" exception="java.lang.Exception"/>
</global-exception-mappings>
<!-- 配置loginAction,registAction,使用通配符配置 -->
<action name ="loginAction" class ="action.LoginAction" >
<result name ="input">WEB-INF/jsp/login.jsp</result>
<result name ="failure">WEB-INF/jsp/error.jsp</result>
</action>
<action name ="registAction" class ="action.RegistAction">
<result name ="input">WEB-INF/jsp/login.jsp</result>
<result name ="failure">WEB-INF/jsp/error.jsp</result>
</action>
<!-- 这个是跳转页面用的,比如我跳转regist.jsp,那么只要请求是regits就可以了。 -->
<action name="*.jsp">
<result>WEB-INF/jsp/{1}.jsp</result>
</action>
</package>

<package name="web_inf_page" extends="struts-default" namespace="/WEB-INF/page" />


</struts>


暗夜螃蟹 2012-03-02
  • 打赏
  • 举报
回复


<struts>
<!-- 开发模式,每次更改配置或者代码后,不用重启服务器 -->
<constant name="struts.devMode" value="true" />
<!-- 允许struts动态请求,只是调用struts里面的某个方法 -->
<constant name = "struts.enable.DynamicMethodInvocation" value = "true"/>

<!-- 空间名为/WEB-INF/page -->
<package name="deng" extends="struts-default" >
<!-- 配置全局result -->
<global-results>
<result name ="success">WEB-INF/jsp/sucess.jsp</result>
<result name ="exception">WEB-INF/jsp/error.jsp</result>
</global-results>
<!-- 配置全局的异常印射 -->
<global-exception-mappings>
<exception-mapping result="exception" exception="java.lang.Exception"/>
</global-exception-mappings>
<!-- 配置loginAction,registAction,使用通配符配置 -->
<action name ="loginAction" class ="action.LoginAction" >
<result name ="input">WEB-INF/jsp/login.jsp</result>
<result name ="failure">WEB-INF/jsp/error.jsp</result>
</action>
<action name ="registAction" class ="action.RegistAction">
<result name ="input">WEB-INF/jsp/login.jsp</result>
<result name ="failure">WEB-INF/jsp/error.jsp</result>
</action>
<!-- 这个是跳转页面用的,比如我跳转regist.jsp,那么只要请求是regits就可以了。 -->
<action name="*.jsp">
<result>WEB-INF/jsp/{1}.jsp</result>
</action>
</package>

<package name="web_inf_page" extends="struts-default" namespace="/WEB-INF/page">




EHOME820 2012-03-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 thl331860203 的回复:]
你把你访问的URL发下我看看

web.xml

struts.xml配置我都看下
[/Quote]
哈哈,谢谢,您真有耐心。
web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- 初始化spring插件的监听器,使用spring作为struts插件-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 验证码的servlet的配置 -->
<servlet>
<servlet-name>authImg</servlet-name>
<servlet-class>authimg.AuthImg</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>authImg</servlet-name>
<url-pattern>/authImg</url-pattern>
</servlet-mapping>

<!-- 配置过滤器,使用strut的一个核心类做过滤器,这个类的引用我命名为strutsDeng -->
<filter>
<filter-name>strutsDeng</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<!-- 用上面的过滤器来处理来自web的请求,如果使用/*,会把servlet也拦截 -->
<filter-mapping>
<filter-name>strutsDeng</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>strutsDeng</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>

<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>




struts.xml

<struts>
<!-- 开发模式,每次更改配置或者代码后,不用重启服务器 -->
<constant name="struts.devMode" value="true" />
<!-- 允许struts动态请求,只是调用struts里面的某个方法 -->
<constant name = "struts.enable.DynamicMethodInvocation" value = "true"/>

<!-- 空间名为/WEB-INF/page -->
<package name="deng" extends="struts-default" namespace="/WEB-INF/page">
<!-- 配置全局result -->
<global-results>
<result name ="success">WEB-INF/jsp/sucess.jsp</result>
<result name ="exception">WEB-INF/jsp/error.jsp</result>
</global-results>
<!-- 配置全局的异常印射 -->
<global-exception-mappings>
<exception-mapping result="exception" exception="java.lang.Exception"/>
</global-exception-mappings>
<!-- 配置loginAction,registAction,使用通配符配置 -->
<action name ="loginAction" class ="action.LoginAction" >
<result name ="input">WEB-INF/jsp/login.jsp</result>
<result name ="failure">WEB-INF/jsp/error.jsp</result>
</action>
<action name ="registAction" class ="action.RegistAction">
<result name ="input">WEB-INF/jsp/login.jsp</result>
<result name ="failure">WEB-INF/jsp/error.jsp</result>
</action>
<!-- 这个是跳转页面用的,比如我跳转regist.jsp,那么只要请求是regits就可以了。 -->
<action name="*.jsp">
<result>WEB-INF/jsp/{1}.jsp</result>
</action>
</package>



<s:form id="loginForm" action ="loginAction" namespace="/WEB-INF/page" >
url: http://127.0.0.1:8080/loginregist/WEB-INF/page/loginAction.action


HTTP Status 404 - /loginregist/WEB-INF/page/loginAction.action

type Status report

message /loginregist/WEB-INF/page/loginAction.action

description The requested resource (/loginregist/WEB-INF/page/loginAction.action) is not available.

Apache Tomcat/6.0.13
暗夜螃蟹 2012-03-02
  • 打赏
  • 举报
回复


你把你访问的URL发下我看看

web.xml

struts.xml配置我都看下
EHOME820 2012-03-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 thl331860203 的回复:]

说简单点

如:http://localhost:8088/webapp/WEB-INF/jsp/loginAction.action
你现在在配置文件中申明了WEB-INF/jsp路径,所以访问没有问题

如果访问下面的就会报错啦
http://localhost:8088/webapp/WEB-INF/page/loginAction.action

……
[/Quote]
不行啊,我配置
   <package name="deng" extends="struts-default" namespace="/WEB-INF/page">

然后把请求也改成了
 <s:form id="loginForm" action ="loginAction" namespace="/WEB-INF/page" >

也还是找不到。我就不明白,我自己怎么跳进/WEB-INF/page这个空间来的。
暗夜螃蟹 2012-03-02
  • 打赏
  • 举报
回复
说简单点

如:http://localhost:8088/webapp/WEB-INF/jsp/loginAction.action
你现在在配置文件中申明了WEB-INF/jsp路径,所以访问没有问题

如果访问下面的就会报错啦
http://localhost:8088/webapp/WEB-INF/page/loginAction.action

你没有申明WEB-INF/page目录却去访问了,一般就会报这样的错
然后你想这样去访问就
是说 <package name="WEB-INF_page" extends="struts-default" namespace="/WEB-INF/page" />
再去申明一个这个目录
暗夜螃蟹 2012-03-02
  • 打赏
  • 举报
回复
'/WEB-INF/page' 是不是你在地址栏输入的时候在这个目录下访问了loginAction这个呀,
暗夜螃蟹 2012-03-02
  • 打赏
  • 举报
回复
你想了解的是流程是吧,我明白了 :浏览器->>web.xml(里面配置struts2引用)->>struts2.xml->>自定义struts2引用->>访问action->>跳转到指定返回页面!
EHOME820 2012-03-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 thl331860203 的回复:]

就这句
<package name="WEB-INF_jsp" extends="struts-default" namespace="/WEB-INF/jsp" />
[/Quote]

不是啊,我的意思是怎么它自己会跳到这个空间来的呢?
暗夜螃蟹 2012-03-02
  • 打赏
  • 举报
回复
就这句
<package name="WEB-INF_jsp" extends="struts-default" namespace="/WEB-INF/jsp" />
暗夜螃蟹 2012-03-02
  • 打赏
  • 举报
回复

你在下面加上一个路径申名
<package name="dg" extends="struts-default" >
<action name ="loginAction" class ="action.LoginAction" >
<result name ="input">WEB-INF/jsp/login.jsp</result>
<result name ="failure">WEB-INF/jsp/error.jsp</result>
</action>
</package>





<package name="WEB-INF_jsp" extends="struts-default" namespace="/WEB-INF/jsp" />

24,923

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 Apache
社区管理员
  • Apache
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧