当前位置: 代码迷 >> J2EE >> struts2 基于注解配置有关问题
  详细解决方案

struts2 基于注解配置有关问题

热度:97   发布时间:2016-04-17 23:21:35.0
struts2 基于注解配置问题
本帖最后由 houpengfei111 于 2013-03-14 11:32:27 编辑
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配置
我访问的url为:http://localhost:8080/项目名称/test/hello.action
结果报错:HTTP Status 404 - There is no Action mapped for namespace [/system] and action name [hello] associated with context path [/struts2_demo].
------解决思路----------------------
建议使用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();
}

}

------解决思路----------------------
apache的mvc注解比较简洁,只需要一个包和一个配置文件就能贯穿整个web工程,
所有注释和异常信息都是中文的,符合国人的编程习惯,并且保证你不会出现404,
我们现在都用这个,struts只能放在尘封的记忆中了。
  相关解决方案