import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Namespace; import org.apache.struts2.convention.annotation.ParentPackage; import org.apache.struts2.convention.annotation.Result; import org.apache.struts2.convention.annotation.ResultPath; import com.opensymphony.xwork2.ActionSupport; @ParentPackage(value = "struts-default") @Namespace("/test") public class HelloAction extends ActionSupport { private static final long serialVersionUID = 1L; @Action(value = "hello", results = { @Result(name = "success", location = "/module/success.jsp") }) public String hello() { return SUCCESS; } } 这是我的action配置。 <?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> <init-param> <param-name>actionPackages</param-name> <param-value>com.ether.module.login</param-value> </init-param> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping> </web-app> 这是我的web.xml配置 <struts> <!-- 请求参数的编码方式--> <constant name="struts.i18n.encoding" value="UTF-8"/> <!-- 指定被struts2处理的请求后缀类型。多个用逗号隔开--> <constant name="struts.action.extension" value="action,do,htm"/> <!-- 当struts.xml改动后,是否重新加载。默认值为false(生产环境下使用),开发阶段最好打开 --> <constant name="struts.configuration.xml.reload" value="true"/> <!-- 是否使用struts的开发模式。开发模式会有更多的调试信息。默认值为false(生产环境下使用),开发阶段最好打开 --> <constant name="struts.devMode" value="false"/> <!-- 设置浏览器是否缓存静态内容。默认值为true(生产环境下使用),开发阶段最好关闭 --> <constant name="struts.serve.static.browserCache" value="false" /> <!-- 是否开启动态方法调用--> <constant name="struts.enable.DynamicMethodInvocation" value="false"/> </struts> 这是我的struts2.xml配置 |
|
怎么可能找不到呢?太神奇了 求高手帮助
|
|
form表单里是否有namespace=”/test”
|
|
我直接从地址栏打地址访问的:
我访问的url为:http://localhost:8080/项目名称/test/hello.action |
|
struts2.xml配置文件里的namespace要和jsp页面中的form表单中action的namespace必须使用相同的命名空间
|
|
我没用struts2的<s:action>标签,就是直接访问,不可以吗?
|
|
而且我访问的路径是对的 ,可就是找不到,我是不是哪里疏忽了?求高手
|
|
你把Action里面的namespace注解去掉试试
|
|
都不好使 这个纠结了。。。。。。。木人回答了吗?
|
|
/module/success.jsp? 有这个吗?
|
|
我告诉你我的解决办法吧,因为我遇到过,你把Action名字改改,再试试,应该行,我就是这样的
|
|
没有配过注解,观望中。
|
|
20分 |
建议使用apache的mvc注解:
web.xml: <servlet> <servlet-name>mvc</servlet-name> <servlet-class>org.apache.commons.mvc.web.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/classes/context.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>mvc</servlet-name> <url-pattern>*.php</url-pattern> </servlet-mapping> context.xml <?xml version="1.0" encoding="UTF-8"?> <beans> <!-- 配置action所在的位置, 多个包用逗号隔开 --> <action package="com.number.control.action"/> <!-- 配置ajax所在的位置(ajax的目的是要把java和javascript合为一体), 多个包用逗号隔开 --> <ajax package="com.number.control.ajax"/> </beans> action的代码: package com.number.control.action; import org.apache.commons.mvc.annotation.ActionBean; import org.apache.commons.mvc.entity.Forward; import org.apache.commons.mvc.web.BaseAction; import org.apache.log4j.Logger; import com.number.entity.Wordage; import com.number.model.WordageModel; /** * 汉字的action * @version 1.0 */ @ActionBean(name = "/wordage") // 这个地址可以在浏览器访问 public class WordageAction extends BaseAction { private static final Logger log = Logger.getLogger(WordageAction.class); private WordageModel model = new WordageModel(); private Wordage bean; /** * 分页列表(这个方法的url:http://你的IP:你的端口/你的工程名称/wordage/list.你配置的后缀) * @return */ public Forward list() { pager = model.pager(bean, pageNo, pageSize); log.info(pager); //return null;// 返回null或"",action不做任何转发动作 return Forward.create("/index.jsp");// 将要转发的url } /** * 这个实体会自动保存在request作用域中 * @return */ public Wordage getBean() { return bean; } /** * 页面提交时,自动封装数据到实体中 * @param bean */ public void setBean(Wordage bean) { this.bean = bean; } } ajax的代码: package com.number.control.ajax; import java.util.List; import org.apache.commons.mvc.annotation.AjaxBean; import org.apache.commons.mvc.annotation.AjaxMethod; import org.apache.commons.mvc.entity.Pager; import org.apache.commons.mvc.web.BaseAjax; import org.apache.log4j.Logger; import com.number.entity.Wordage; import com.number.model.WordageModel; /** * 汉字的ajax * @version 1.0 */ @AjaxBean(name = "wordageAjax") // 这个名称可以在页面生成javascript对象 public class WordageAjax extends BaseAjax { private static final Logger log = Logger.getLogger(WordageAjax.class); private WordageModel model = new WordageModel(); /** * 无刷新分页列表, 在页面引入两个js文件即可使用: * <script type="text/javascript" src="/你的工程名称/org/apache/commons/mvc/res/js/public.js.你配置的后缀"></script> * <script type="text/javascript" src="/你的工程名称/commons/mvc/ajax/wordageAjax.js.你配置的后缀"></script> * 页面就这样写:wordageAjax.list("{charm:""""}", 1, 20, function(result) {alert(result.list.length);}); * @param bean * @param pageNo * @param pageSize * @return */ @AjaxMethod // 加上这个注解,页面的js可以直接调用这个方法,让js和java合为一体 public Pager<Wordage> list(Wordage bean, Integer pageNo, Integer pageSize) { Pager<Wordage> pager = model.pager(bean, pageNo, pageSize); log.info(pager); return pager; } /** * 所有声母 * @return */ @AjaxMethod public List<String> getAllCoice() { return model.getAllCoice(); } /** * 所有韵母 * @return */ @AjaxMethod public List<String> getAllCharm() { return model.getAllCharm(); } } |
20分 |
apache的mvc注解比较简洁,只需要一个包和一个配置文件就能贯穿整个web工程,
所有注释和异常信息都是中文的,符合国人的编程习惯,并且保证你不会出现404, 我们现在都用这个,struts只能放在尘封的记忆中了。 |
该action 包命名是否符合struts2的规范 包应该叫action.. 等
|
|
应该是缓存问题,把发布的项目清了重新发布一下就好了
|
|
楼主这个问题解决了没
|
|
HTTP Status 404 – There is no Action mapped for namespace [/system] and action name [hello] associated with context path [/struts2_demo].
namespace [/system] 说明你的路径输入错误了 应该是 http://localhost:8080/项目名称/test/hello.action 你的namespace应该是/test |