Struts2中action注解使用异常

Struts2中action注解使用异常

异常展示

初学Struts2,简单串一遍Struts2的流程,实现如下功能:

需求:

浏览器发出/list请求,服务器响应到empList.jsp页面

流程设计

/list ---> StrustPrepareAndExecuteFilter --> EmpAction ---> Result (dispatcher)---> empList.jsp页面

流程实现

- 搭建Struts2环境

    -   struts2开发包和注解配置包(struts2-convention-plugin-2.3.31.jar)

    -   struts.xml配置文件


- 编写一个empList.jsp

- 编写一个EmpListAction组件

- 在web.xml配置StrustPrepareAndExecuteFilter控制器

- 在EmpListAction中使用@Action、@Result、@ParentPackage、@NameSpace注解配置请求

工程结构如图

Emplist类如下:

    @ParentPackage("struts-default")
    @Namespace("/")

    public class EmpList {

        /**
         * 员工列表
         */
        private List<Emp> emps;

        public List<Emp> getEmps() {
            return emps;
        }

        public void setEmps(List<Emp> emps) {
            this.emps = emps;
        }

        @Action(value = "/list", results = { @Result(name = "success", type = "dispatcher", location = "/emp.jsp") })

        public String execute() {
            return "success";
        }
    }

之前使用Struts.xml 配置,程序可以顺利进行,使用action的注解配置之后,请求发出之后出现404的异常,如下图所示:

很显然qingqiu并没有被映射到任何一个action,注解配置出了问题,查询资料后发现结果在struts2-convention-plugin-2.3.31.jar底层对action组件的映射规则上,打开Convention Plugin中struts-plugin.xml配置发现在struts-plugin.xml中,action的名称的映射是:

  <constant name="struts.convention.action.suffix" value="Action"/>
  <constant name="struts.convention.action.disableScanning" value="false"/>
  <constant name="struts.convention.action.mapAllMatches" value="false"/>
  <constant name="struts.convention.action.checkImplementsAction" value="true"/>
  <constant name="struts.convention.default.parent.package" value="convention-default"/>
  <constant name="struts.convention.action.name.lowercase" value="true"/>
  <constant name="struts.convention.action.name.separator" value="-"/>
  <constant name="struts.convention.package.locators" value="action,actions,struts,struts2"/>
  <constant name="struts.convention.package.locators.disable" value="false"/>
  <constant name="struts.convention.package.locators.basePackage" value=""/>
  <constant name="struts.convention.exclude.packages" value="org.apache.struts.*,org.apache.struts2.*,org.springframework.web.struts.*,org.springframework.web.struts2.*,org.hibernate.*"/>
  <constant name="struts.convention.relative.result.types" value="dispatcher,velocity,freemarker"/>
  <constant name="struts.convention.redirect.to.slash" value="true"/>
  <constant name="struts.convention.action.alwaysMapExecute" value="true"/>
  <constant name="struts.mapper.alwaysSelectFullNamespace" value="true"/>

这个是默认的配置,就是去掉Action结尾的单词,把剩余的都转化为小写,然后在中间加上“-”,

扫描二维码关注公众号,回复: 1569000 查看本文章

例如:
AdminUserAction映射后变成:admin-user.action,这样的映射规则个人感觉很别扭,想用原来的习惯映射成:adminUser.action

将类名修改为EmpListAction之后程序顺利运行。

爬坑经验:

为避免出错,按照规范,action组件类名以Action结尾。

具体的映射规则,有待以后研究。

参阅http://blog.sina.com.cn/s/blog_3e8afd2e0100cp76.html

猜你喜欢

转载自blog.csdn.net/a2011102394/article/details/77168572