最近在看Struts2的showcase,本打算先找个简单的看看,就选择了person,要么说没有中彩票的运气,第一个例子我就看不明白了,person的index.jsp里是这样调用action的
<html>
<head>
<title>Acme Corp</title>
</head>
<body>
<ul>
<li><a href="newPerson!input.action">Create</a> a new person</li>
<li><a href="listPeople.action">List</a> all people</li>
</ul>
</body>
</html>
但是在struts-person.xml里却没有这个action的声明,只是声明了一个包,也没有默认的action类,后来”百度“了一下才知道,这个是Struts2的新特性,使用注解配置Action。
使用注解配置Action第一个要做的就是在web.xml中配置FilterDispatcher,为FilterDispatcher设置actionPackages参数,指定包含了Action类的包的列表,多个包之间用(,)分割,这些包和他们的子包都会被扫描。扫描的对象是包中所有实现了Action接口,或者以"Action"结尾的类。顺便说一下类名的匹配方法,把类名的第一个字母小写,如果以Action结尾的,去掉Action。比如说一个类叫 DeletePersonAction 那么他的请求应该是deletePersion.action。
<filter>
<filter-name>struts-prepare</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter</filter-class>
<init-param>
<param-name>actionPackages</param-name>
<param-value>org.apache.struts2.showcase.person</param-value>
</init-param>
</filter>
这个配置的意思就是会扫描org.apache.struts2.showcase.person包里所有实现了Action接口,或者以"Action"结尾的类,所以"newPerson!input.action"这个请求对应的类应该是NewPersonAction的input方法。
我们再看看NewPersonAction.java这个文件
@ParentPackage("person")
public class NewPersonAction extends ActionSupport {
private static final long serialVersionUID = 200410824352645515L;
PersonManager personManager;
Person person;
public void setPersonManager(PersonManager personManager) {
this.personManager = personManager;
}
public String execute() {
personManager.createPerson(person);
return SUCCESS;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
}
所谓的零配置就是把相关的注解写到Action类里,比如ParentPackage,Namespace,Result,Results
例如:
@Namespace("/person") //指定名称空间
@ParentPackage("person") //指定继承的包,struts-default无需指定
@Result("/success.jsp") //指定success,因为success是默认的,所以不用指定name
@Results({
@Result("name="input", value="/input.jsp"),
@Result("name="error", value="/error.jsp", type=ServletDispatcherResult.class)
})
public class NewPersonAction extends ActionSupport {
。。。。
}
但是NewPersonAction.java里并没有指定result,那它是怎么转移的呢?这个是codebehind插件的作用。在struts.xml里有这样的设定,也就是说person这个包应用了codebehind的功能
<constant name="struts.codebehind.defaultPackage" value="person" />
按照以上参考资料,我将以前用xml配置action的测试项目修改如下:
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
<init-param> <!-- 添加使用注解必须的参数-->
<param-name>actionPackages</param-name>
<param-value>com.testman.action</param-value>
</init-param>
</filter>
在struts.xml中注释掉以前的配置信息
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- <constant name="struts.codebehind.defaultPackage" value="action" /> -->
<constant name="struts.i18n.encoding" value="UTF-8"/>
<constant name="struts.serve.static.browserCache" value="false"/>
<!-- <constant name="struts.action.extension" value="do"/>
<constant name="struts.configuration.xml.reload" value="true"/>
<constant name="struts.devMode" value="true" /> -->
<!-- 默认的视图主题 -->
<constant name="struts.ui.theme" value="simple" />
<!--下面表示action对象是spring负责创建的 -->
<constant name="struts.objectFactory" value="spring" />
<!-- <package name="fundbalance" namespace="/fundbalance" extends="struts-default">
<global-results>
<result name="message">/WEB-INF/page/fundbalance/message.jsp</result>
</global-results> -->
<!-- <action name="action_*" class="fundBalanceList" method="{1}"> --> <!-- "fundBalanceList"对应的是spring容器中bean的名称 -->
<!-- <result name="list">/WEB-INF/page/fundbalance/fundbalancelist.jsp</result>
<result name="add">/WEB-INF/page/fundbalance/addfundbalance.jsp</result>
<result name="update">/WEB-INF/page/fundbalance/updatefundbalance.jsp</result>
<result name="query">/WEB-INF/page/fundbalance/fundbalancelist.jsp</result>
</action>
</package> -->
</struts>
action修改如下
package com.testman.action;
import java.util.List;
import javax.annotation.Resource;
import org.apache.struts2.config.Namespace;
import org.apache.struts2.config.Result;
import org.apache.struts2.config.Results;
import com.opensymphony.xwork2.ActionSupport;
import com.testman.bean.FundBalance;
import com.testman.service.FundBalanceService;
@Namespace("/fundbalance")
@Results({
@Result(name="list",value="/WEB-INF/page/fundbalance/fundbalancelist.jsp"),
@Result(name="add",value="/WEB-INF/page/fundbalance/addfundbalance.jsp"),
@Result(name="addUI",value="/WEB-INF/page/fundbalance/addfundbalance.jsp"),
@Result(name="update",value="/WEB-INF/page/fundbalance/updatefundbalance.jsp"),
@Result(name="updateUI",value="/WEB-INF/page/fundbalance/updatefundbalance.jsp"),
@Result(name="query",value="/WEB-INF/page/fundbalance/fundbalancelist.jsp"),
@Result(name="message",value="/WEB-INF/page/fundbalance/message.jsp")
})
//@Result("/index.jsp")
public class FundBalanceAction extends ActionSupport{
@Resource FundBalanceService fundBalanceService;
private String message;
private List<FundBalance> fundbalances;
private FundBalance fundbalance;
private String delkeys;
public FundBalance getFundbalance() {
return fundbalance;
}
public void setFundbalance(FundBalance fundbalance) {
this.fundbalance = fundbalance;
}
/**
*/
public String list(){
this.fundbalances = fundBalanceService.getAllFundBalance();
return "list";
}
/**
*/
public String addUI(){
return "add";
}
public String updateUI(){
fundbalance = fundBalanceService.queryFundBalanceById(this.fundbalance).get(0);
return "update";
}
/**
*/
public String add(){
this.fundBalanceService.save(this.fundbalance);
this.message="数据保存成功!";
return "message";
}
/**
*/
public String update(){
this.fundBalanceService.update(this.fundbalance);
this.message="数据更新成功!";
return "message";
}
public String query(){
this.fundbalances = fundBalanceService.queryFundBalanceByYearMonthItem(this.fundbalance);
return "query";
}
public String del(){
if(this.delkeys.contains(",")){
String[] keys = this.delkeys.split(",");
for(String key : keys){
if(!"".equals(key)){
this.fundBalanceService.delete(key);
}
}
}else{
this.fundBalanceService.delete(delkeys);
}
this.message="数据删除成功!";
return "message";
}
public List<FundBalance> getFundbalances() {
return fundbalances;
}
public void setFundbalances(List<FundBalance> fundbalances) {
this.fundbalances = fundbalances;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getDelkeys() {
return delkeys;
}
public void setDelkeys(String delkeys) {
this.delkeys = delkeys;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return SUCCESS;
}
}
最后,页面上再把action的指向修改成 形如 f
undBalance!add.action 即可。
分享到:
相关推荐
"Struts2 注解配置 Action 及拦截器几种不同方式写法对应的路径指向" Struts2 注解配置 Action 及拦截器是 Struts2 框架中的核心组件之一,负责处理用户请求并返回响应结果。下面,我们将通过详细的解释和示例代码...
在"Struts 2使用注解配置Action"中,我们不再需要在struts.xml中为每个Action类手动添加配置。相反,我们可以在Action类或者方法上直接使用注解来声明它们的功能。这样不仅提高了代码的可读性,还使得配置更加灵活。...
Struts2中使用注解配置Action方法详解 Struts2框架提供了四个与Action相关的注解类型,分别为ParentPackage、Namespace、Result和Action。这四个注解类型可以帮助开发者更方便地配置Action,实现零配置,零配置将从...
Struts2注解配置教程是指导开发者如何使用Java注解替代传统的XML配置来配置Struts2框架的一个教程系列。本文档主要涵盖了Struts2中注解配置的一些基本知识点以及如何通过注解实现零配置。 ### 注解配置之前 在介绍...
本文旨在为读者提供一套详尽的Struts2注解配置指南,帮助大家快速理解和掌握如何通过注解来配置Struts2的Action。 #### 二、Struts2注解配置基础 ##### 1. Struts2注解支持概述 - **插件依赖**:要启用Struts2的...
Struts2注解配置是Java Web开发中一种高效、简洁的框架配置方式,它允许开发者在类或方法级别上直接定义Action、结果类型、参数映射等信息,从而避免了传统XML配置文件的繁琐。本资料集合了关于Struts2注解配置的...
Struts2 和 Spring 的整合是企业级 Java Web 开发中常见的技术栈,通过注解配置可以使项目更加简洁、易于维护。Struts2 提供了一种使用注解替代 XML 配置的方式,使得开发者无需编写繁琐的 struts.xml 文件,即可...
Struts2注解登录是Java Web开发中一种简化配置的方式,它允许开发者在代码中直接定义控制器、动作和结果页面的映射,从而避免了传统方式下需要在`struts.xml`配置文件中的繁琐设置。这种做法提高了代码的可读性和可...
本教程将通过一个"Struts2注解Demo"来深入探讨Struts2中的注解用法,帮助开发者更高效地配置和管理Action类。 首先,Struts2的注解允许我们避免传统的XML配置,从而实现更加简洁、直观的编程方式。在`Struts2Demo`...
Struts2 Convention Plugin允许开发者通过注解来配置Action名称、拦截器、命名空间等,极大地简化了配置过程。 ##### 2.7 默认Action及结果 当用户访问特定路径时,如果没有显式定义Action,则Convention Plugin会...
在Struts2框架中,注解开发是一种简化配置的方式,它允许开发者在类或方法级别直接标注,以定义动作、结果、参数等信息,从而减少XML配置文件的使用。本知识点将详细介绍Struts2中的注解开发及其核心组件。 标题...
在Struts2中,注解提供了一种声明式的方式来配置Action类和结果页面,而无需编写XML配置文件。这使得代码更加简洁,易于理解和维护。例如,你可以使用`@Action`注解标记一个方法作为处理用户请求的Action,使用`@...
可以通过配置项 `struts.convention.package.locators` 来指定搜索的位置,例如:`actions`, `action`, `struts`, `struts2` 等。这表示框架会在这些命名空间下查找 Action 类。此外,还可以通过 `struts.convention...
在这个例子中,`src/main/java`下会有Action类,`src/main/resources`可能包含Struts2的配置文件,尽管在注解配置中我们可能不再需要传统的XML配置。此外,`src/main/webapp`目录下会存放JSP页面和其他Web资源。 在...
这个插件的核心功能就是利用注解来自动配置Action、结果类型、参数映射等,使得开发过程更加便捷。2.1.8.1是这个插件的版本号,每个版本可能包含性能优化、新特性和bug修复。 在Struts2中,以下几个关键注解经常被...
首先,了解`@Action`注解是理解Struts2注解配置的关键。这个注解用于标记一个类或方法作为处理HTTP请求的动作。例如: ```java @Action(value = "saveUser", results = { @Result(name = "success", location = ...
总结一下,Struts2的注解配置Action可以简化开发流程,提高效率。`@Action`和`@Result`注解是主要的工具,它们帮助我们定义Action的URL和结果页面。同时,遇到`NoClassDefFoundError`异常时,检查并确保项目依赖正确...
Struts2的注解配置主要集中在Action类和结果类型上。使用@Action注解,我们可以直接在Action类上声明其对应的URL路径,而无需在struts.xml文件中进行配置。例如: ```java @Action(value = "saveUser", results = {...
此外,Struts2还提供了其他注解,如`@Results`、`@Namespace`、`@ParentPackage`等,它们分别用于定义一组结果、Action所属的命名空间以及继承的配置包。这些注解可以帮助我们在不编写XML配置的情况下,完成大部分的...
Struts2 是一个流行的Java Web框架,用于构建MVC(模型-视图-控制器)架构的应用程序。在Struts2的版本2.1之后,它引入...例如,可以使用Struts2的注解(如`@Action`,`@Result`等)来覆盖或补充Convention的默认行为。