struts2---基于Annotaion配置

从整个java开发来讲,2005年是一个分界点,一些旧的开发框架逐步退出主舞台,但是struts2留下来了.从Apache收购了Webwork开始,webwork开始全新发展,但最开始没有太大更新,但随着它不断的发展,积极响应Annotaion的配置过程.

  • 要使用Annotation需要有struts2-convention-plugin-2.3.37.jar开发包的支持
  • 设置web.xml文件,新版本的struts2之中不需要就能够直接使用注解了.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>AnnotationProject</display-name>
 <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
        
        <init-param>
	  		<param-name>actionPages</param-name>   <!-- 设置Anntation扫描包 -->
	  		<param-value>mao.shu.action</param-value>	<!-- 所有Action的保存路径 -->
  		</init-param>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

核心配置

  • 在整个的项目之中最为重要的内容就是Action.但是任何的项目之中都有特殊的需求配置.例如:全局跳转,拦截器定义.

  • 定义公共的配置文件信息

  • 配置struts.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="true" />

    <package name="root" namespace="/" extends="struts-default">
    <!--  全局跳转路径-->
	<global-results >
		<result name="error">/error.jsp</result>
		<result name="login">/login.jsp</result>
	</global-results>
 
    </package>
</struts>

  • 定义Action并且使用Annotaion定义Action相关配置
  1. 配置Action程序类
package mao.shu.action;

import org.apache.struts2.convention.annotation.Action;

import com.opensymphony.xwork2.ActionSupport;
@Action("HelloAction")
public class HelloAction extends ActionSupport {
	public String show(){
		return "welcome";
	}
}

  • 相当于原struts.xml文件之中的
<action name="HelloAction" class="mao.shu.action.HelloAction">

</action>
  1. 使用Annotation配置父路径
package mao.shu.action;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.ParentPackage;

import com.opensymphony.xwork2.ActionSupport;
@Action("HelloAction")
@ParentPackage(value="root")//继承自父路径
public class HelloAction extends ActionSupport {
	public String show(){
		return "welcome";
	}
}

  • @ParentPackage(value=“root”)的配置相当于原struts.xml文件之中的 extends=“struts-default”
<package name="root" namespace="/" extends="struts-default" >
  1. 配置Action类的nameSpace,改变Action所在项目的路径位置
package mao.shu.action;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;

import com.opensymphony.xwork2.ActionSupport;
@Action("HelloAction")
@ParentPackage(value="root")//继承自父路径
@Namespace("/page/back/")//定义Action类的访问路径
public class HelloAction extends ActionSupport {
	public String show(){
		return "welcome";
	}
}
package mao.shu.action;

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.Results;

import com.opensymphony.xwork2.ActionSupport;

@ParentPackage(value="root")//继承自父路径
@Action("HelloAction")
@Namespace("/page/back")//定义Action类所在的路径
@Results(//配置多个跳转路径
			value={
					@Result(name="success",location="/page/back/list.jsp"),
					@Result(name="error",location="/welcom.jsp")
			}
		)
public class HelloAction extends ActionSupport {
	public String show(){
		return "welcome";
	}
}

  • 使用Annotation的配置还是有些好处的.可以为每一个方法单独定义路径
@Actions(
		value={@Action("show"),@Action("hello")}	
		)
public String show(){
	return "welcome";
}

拦截器配置

  • 在struts.properties文件中配置拦截器
<interceptors>
	<interceptor-stack name="maoshu">
		<interceptor-ref name="timer"></interceptor-ref>
		<interceptor-ref name="defaultStack"></interceptor-ref>
	</interceptor-stack>
</interceptors>
  • 在Action进行拦截器的引用,引用拦截器分为两种情况
  1. 引用单个拦截器
@InterceptorRef(value="timer")
  1. 引用多个拦截器
@InterceptorRefs(value={
		@InterceptorRef(value="timer"),
		@InterceptorRef(value="defaultStack")
})
  • 在进行拦截器配置的时候可能需要有一些属性.例如:文件上传:
@InterceptorRefs(value={
		@InterceptorRef(value="timer"),
		@InterceptorRef(value="defaultStack"),
		//设置文件上传拦截器,并设置最大上传文件大小为"20M"
		@InterceptorRef(value="fileUpload",params={"maximumSize","20971520"})
})
  • 实际的开发之中若允许使用Annotation进行配置,最好在struts.xml文件之中配置好之后再使用Annotation进行引用

数据验证

所有的框架本省所提供的炎症处理,都会有一个问题,由于每一个Action都有多业务处理,但是有可能出现方法一需要验证,方法二不需要验证呢个,

  • 定义一个Member.java类
package mao.shu.vo;

import java.io.Serializable;

public class Member implements Serializable {
	private String name;
	private String password;
	private Integer age;
	private String email;
	
	//...
	//getter和setter方法
	//...
	
	@Override
	public String toString() {
		return "Member [name=" + name + ", password=" + password + ", age=" + age + ", email=" + email + "]";
	}
	
	
}
  • 在MessageAction中编写验证处理,当验证出现错误的时候系统会自动找到input页面之中
package mao.shu.action;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.InterceptorRefs;
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.Results;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.validator.annotations.RequiredStringValidator;
import com.opensymphony.xwork2.validator.annotations.Validations;

import mao.shu.vo.Member;

@ParentPackage(value="root")//继承自父路径
@Namespace("/page/back")//定义Action类所在的路径
@Action(value="/page/back/MemberAction")
@Results(//配置多个跳转路径
			value={
					@Result(name="success",location="/page/back/list.jsp"),
					@Result(name="error",location="/welcom.jsp"),
					@Result(name="welcome",location="/welcome.jsp"),
			}
		)
@InterceptorRefs(value={
		@InterceptorRef(value="defaultStack"),
})
@Validations(
		requiredStrings={
				@RequiredStringValidator(fieldName="member.name",message="用户名不能为空!"),
				@RequiredStringValidator(fieldName="member.password",message="用户名密码不能够为空!"),
				@RequiredStringValidator(fieldName="member.age",message="用户名年龄不能够为空!"),
				@RequiredStringValidator(fieldName="member.email",message="用户email不能够为空!")
		}
)
public class MemberAction extends ActionSupport {
	private Member  member;
	@Action("show")
	public String show(){

		System.out.println(this.member);
		return "welcome";
	}
	public Member getMember() {
		return member;
	}
	public void setMember(Member member) {
		this.member = member;
	}
	
	
	
}

  • input.jsp页面,因为在struts2中,所有的错误信息都保存在fieldErrors 属性之中,因此可以使用EL表达式输出错误集合
	<h1>${fieldErrors }</h1>
  • 访问http://localhost:8080/AnnotationProject/page/back/MemberAction

在这里插入图片描述

  • 进一步修改,进行正则验证
  • 其中"key"为i18n国际化配置文件中匹配的key
@Validations(
		requiredStrings={
				@RequiredStringValidator(fieldName="member.name",message="用户名不能为空!"),
				@RequiredStringValidator(fieldName="member.password",message="用户名密码不能够为空!"),
				@RequiredStringValidator(fieldName="member.age",message="用户名年龄不能够为空!"),
				@RequiredStringValidator(fieldName="member.email",message="用户email不能够为空!")
		},
		regexFields={
				@RegexFieldValidator(fieldName="member.mid",regexExpression="\\d+",key="validate.int.error"),
				@RegexFieldValidator(fieldName="member.email",regexExpression="\\w+@\\w+\\.\\w",message="请输入正确的邮箱信息"),
		}
)

在这里插入图片描述

  • 但是后台会出现这样的错误,这种错误还未能够解决,所以开发的时候很少会使用Annotation进行验证

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值