struts 2——基础知识

目录

说明

struts 2——基础知识

struts2 核心拦截器

web.xml,代码片.

	<!-- strust 2的核心过滤器 -->
  	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/ *</url-pattern>
	</filter-mapping>

struts2 基本配置

struts2.xml,代码片.

<?xmi 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.devMode" value="true" />
	<constant name="struts.custom.i18n.resources" value="messageResources" />
	<package name="Struts2_OGNL_DEMO" extends="struts-default">
		<!-- 定义拦截器 -->
		<interceptors>
			<interceptor name="helloworld" class="com.HelloWorldInterceptor" />
		</interceptors>
		<action name="test" class="com.MyAction">
			<result>success.jsp</result>
			<!-- action中引用拦截器 -->
			<interceptor-ref name="helloworld" />
			<interceptor-ref name="defaultStack" />
		</action>
	</package>
</struts>

在struts.xml中配置常量

代码片.


<struts>

	<!-- 全局结果集、全局属性 。。。。。-->

	<!-- 定义一个全局常量 -->
	<constant name="url" value="xxxxx" />
	<package name="Struts2_OGNL_DEMO" extends="struts-default">
		<action name="login" class="com.LoginAction">	
			<!-- 定义一个action内的常量 -->
			<param name="url">https://blog.csdn.net/qq_37051166</param>
		</action>
	</package>
</struts>

说明

  1. < param >的值在action的ActionContext.get(“url”)方法就可以获取。

action的实现

继承ActionSupport ,代码片.

public class MyAction extends ActionSupport {
	@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
		System.out.println("Action execute......");
		return SUCCESS;
	}
}

拦截器的实现

继承AbstractInterceptor,代码片.

public class HelloWorldInterceptor extends AbstractInterceptor {
    //拦截方法
	@Override
	public String intercept(ActionInvocation arg0) throws Exception {
		// 获得被调用的Action类
		Object action = arg0.getAction();
		//打印HelloWorld
		System.out.println("拦截器信息:HelloWorld!");
		//执行Action或调用下一个拦截器
		String result = arg0.invoke();
		//执行完action后提示
		System.out.println("Action执行完毕!");
		return result;
	}
}

实现Interceptor,代码片.

public class HelloWorldInterceptor implements Interceptor {
    //拦截方法
	@Override
	public String intercept(ActionInvocation arg0) throws Exception {
		// 获得被调用的Action类
		Object action = arg0.getAction();
		//打印HelloWorld
		System.out.println("拦截器信息:HelloWorld!");
		//执行Action或调用下一个拦截器
		String result = arg0.invoke();
		//执行完action后提示
		System.out.println("Action执行完毕!");
		return result;
	}
	//初始化方法
	@Override
	public void init() {	
	}
	//销毁方法
	@Override
	public void destroy() {	
	}	
}

访问action的三种方式

1)在配置文件指定action标签的method属性

代码片`.

		<action name="test" class="com.MyAction" method="add">
			<result>success.jsp</result>
		</action>

页面请求,代码片.

		<form action="test" ..>

说明:
请求test的add方法

2)用感叹号的方式

要配置全局属性开启感叹号方式的功能,代码片.

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

代码片.

		<action name="test" class="com.MyAction">
			<result>success.jsp</result>
		</action>

页面请求,代码片.

		<form action="test!add" ..>

说明:
请求test的add方法

3)在配置文件中使用通配符的方式

配置,代码片.

		<action name="test_*" class="com.MyAction" method="{1}">
			<result>success.jsp</result>
		</action>

页面请求,代码片.

		<form action="test_add" ..>

说明:
请求test的add方法

获取请求页面数据的三种方式

1)在action类中定义与表单项一一对应的属性

要实现属性的set、get方法
action类, 代码片.

public class MyAction extends ActionSupport {
	private String name;//用户名
	private String password;//密码
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	@Override
	public String execute() throws Exception {
		System.out.println("这是 execute......");
		return SUCCESS;
	}
}

表单,代码片.

		<!-- C标签定义 -->
		<s:textfield name="name" label="用户名"/>
		<s:password name="password" label="密  码" />
2)在action类中定义 表单项一一对应属性的实体类属性

要实现实体类的set、get方法,页面表单的格式要写错 实体类名.属性名 的格式
action类,代码片.

public class MyAction extends ActionSupport {
	User user;
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
		System.out.println("Action execute......");
		return SUCCESS;
	}
}

表单,代码片.

		<!-- C标签定义 -->
		<s:textfield name="User.name" label="用户名"/>
		<s:password name="User.password" label="密  码" />

实体类,代码片.

public class User implements Serializable {
	private String name;//用户名
	private String password;//密码
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
}
3)action类实现模型接口ModelDriven< T >获取数据

在action类中定义实体类对象,并实例化,还要求实体类属性和表单项名是一对一的
action类,代码片.

public class MyAction extends ActionSupport implements ModelDriven<User>{
	User user=new User();
	@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
		System.out.println("Action execute......");
		return SUCCESS;
	}
	@Override
	public User getModel() {
		// TODO Auto-generated method stub
		return user;
	}
}

表单,代码片.

		<!-- C标签定义 -->
		<s:textfield name="name" label="用户名"/>
		<s:password name="password" label="密  码" />

实体类,代码片.

public class User implements Serializable {
	private String name;//用户名
	private String password;//密码
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
}

struts的s 标签,

开启s标签:< %@ taglib prefix=“s” uri="/struts-tags"% >
代码片.

<%@ page language="java" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>注册界面</title>
</head>
<s:actionerror />
<s:actionmessage />
<s:fielderror />
<body>
	<!-- 用户信息注册form表单 -->
	<s:form action="tag.action" method="post">
		<!-- 文本框 设置约束,最大长度、非空 -->
		<s:textfield name="userBean.userId" label="学号" maxlength="9"
			required="true" />
		<!-- 文本框 设置约束,最大长度、非空 -->
		<s:textfield name="userBean.userName" label="姓名" maxlength="9"
			required="true" />
		<!-- 密码文本框 设置约束,最大长度、非空 -->
		<s:password name="userBean.password" label="密码" maxlength="9"
			required="true" />
		<!-- 文本框 设置约束,时间类型的,格式yyyy-MM-dd hh:MM:ss -->
		<s:textfield name="userBean.birthday" label="生日">
			<s:param name="value">
				<s:date name="userBean.birthday" format="yyyy-MM-dd hh:MM:ss" />
			</s:param>
		</s:textfield>
		<!-- 单选框 -->
		<s:radio name="userBean.sex" label="性别" list="{'男','女'}" />
		<!-- 复选框 -->
		<s:checkboxlist name="userBean.hobby" label="爱好"
			list="{'足球', '游泳', '下棋','唱歌'}" />
		<!-- 下拉菜单 -->
		<s:select name="userBean.city" label="所在地" list="{'江苏','上海','南京'}" />
		<!-- 文本域 -->
		<s:textarea tooltip="WriteSomething" label="备注"
			name="userBean.remarks" cols="20" rows="3" />
		<!-- 提交按钮 -->
		<s:submit value="提交" />
		<!-- 重置按钮 -->
		<s:reset value="重置" />
	</s:form>
</body>
</html>

表单校验

在页面中开启校验,代码片.

	<!-- validate="true"表示客户端校验 -->
	<s:form action="reg.action"  validate="true">

RegisterAction-validation.xml,代码片.

<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.2//EN" 
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
	<!-- 表单属性名username -->
	<field name="username">
	
		<!-- 正则表达式:regex -->
		<field-validator type="regex">
			<param name="trim">true</param>
			<param name="expression"><![CDATA[(\w{4,25})]]></param>
			<message >你的用户名长度必须在420之间,且必须是字母和数字</message>
		</field-validator>
		
		
		<!-- 字符串长度校验 -->
		<field-validator type="stringlength">
			<!-- 最小长度 -->
			<param name="minLength">6</param>
			<!-- 最大长度 -->
			<param name="maxLength">8</param>
			<!-- 错误信息 -->
			<message>用户名长度必须在
				${minLength}-${maxLength}位之间</message>
		</field-validator>
		<!-- 字符串类型的非空 -->
		<field-validator type="requiredstring">
			<message key="name.requried" />
		</field-validator>
	</field>
	
	<field name="password">
		<!-- 字符串长度校验 -->
		<field-validator type="stringlength">
			<param name="minLength">6</param>
			<param name="maxLength">8</param>
			<message>密码长度必须在
				${minLength}-${maxLength}位之间</message>
		</field-validator>
		<field-validator type="requiredstring">
			<message>请输入密码</message>
		</field-validator>
	</field>
	
	<field name="repassword">
		<!-- 字符串长度校验 -->
		<field-validator type="stringlength">
			<param name="minLength">6</param>
			<param name="maxLength">8</param>
			<message>确认密码长度必须在
				${minLength}-${maxLength}位之间</message>
		</field-validator>
		<field-validator type="requiredstring">
			<message>请输入确认密码</message>
		</field-validator>
		<!-- 校验两个属性值是否一样 -->
		<field-validator type="fieldexpression">
			<param name="expression">password==repassword</param>
			<message>确认密码和密码输入不一致</message>
		</field-validator>
	</field>
	
	<field name="birthday">
		<!-- 空值校验 -->
		<field-validator type="required">
			<message>请输入生日日期</message>
		</field-validator>
		<!-- 时间类型 -->
		<!-- 时间范围校验 -->
		<field-validator type="date">
			<!-- 最小值 -->
			<param name="min">1928-01-01</param>
			<!-- 最大值 -->
			<param name="max">2004-01-01</param>
			<message>输入生日日期无效</message>
		</field-validator>
	</field>
	
	<field name="mobile">
		<!-- 空值校验 -->
		<field-validator type="requiredstring">
			<message>请输入手机号码</message>
		</field-validator>
		<!-- 字符串长度校验 -->
		<field-validator type="stringlength">
			<param name="minLength">11</param>
			<message>请输入正确的手机号码,
				号码位数必须为11</message>
		</field-validator>
	</field>
	
	<field name="age">
		<!-- 整型校验 -->
		<field-validator type="conversion" short-circuit="true">
			<param name="repopulateField">false</param>
			<message>年龄必须为整数</message>
		</field-validator>
		<!-- 空值校验 -->
		<field-validator type="required">
			<message>请输入年龄</message>
		</field-validator>
		<!-- 整数范围校验 -->
		<field-validator type="int">
			<param name="min">1</param>
			<param name="max">80</param>
			<message>年龄必须在${min}-${max}岁之间</message>
		</field-validator>
	</field>
	
	<field name="email">
		<!-- email类型校验 -->
		<field-validator type="email">
			<message>请输入正确的电子邮件格式</message>
		</field-validator>
	</field>
</validators>

说明

  1. 校验失败自动显示在原界面。
  2. 和校验类在一个目录内。
  3. 校验文件的命名方式:类名-validation.xml == RegisterAction-validation.xml

国际化

开启国际化,代码片.

	<constant name="struts.custom.i18n.resources" value="messageResources" />

messageResources 是文件名称。

messageResources_zh_CN.properties,乱码了,代码片.

HelloWorld=\u4F60\u597D\uFF0C\u4E16\u754C\uFF01
name=\u7528\u6237\u540D\u79F0
pass=\u7528\u6237\u5BC6\u7801
username=\u7528\u6237\u540D
password1=\u5BC6\u7801
password2=\u786E\u8BA4\u5BC6\u7801
birthday=\u751F\u65E5
register=\u6CE8\u518C
title=\u7528\u6237\u6CE8\u518C\u754C\u9762
name.requried=\u8BF7\u8F93\u5165\u7528\u6237\u540D
name.length=\u7528\u6237\u540D\u957F\u5EA6\u5FC5\u987B\u5728${minLength}-${maxLength}\u4F4D\u4E4B\u95F4
password.requried=\u8BF7\u8F93\u5165\u5BC6\u7801
password.length=\u5BC6\u7801\u957F\u5EA6\u5FC5\u987B\u5728${minLength}-${maxLength}\u4F4D\u4E4B\u95F4

messageResources_en_US.properties,代码片.

HelloWorld=Hell World!
name=username
pass=password
username=Your Name
password1=Password
password2=confirm Password
birthday=Birthday

引用国际化,在标签中使用key属性,代码片.

  在页面表单中
<s:textfield name="username" key="username"/>
  或
  在校验文件中
<field name="password">
	<field-validator type="requiredstring">
		<message key="password.requried" />
	</field-validator>
</field>

注意
国际化资源文件要放在项目根目录。

在struts中使用资源对象

在action中,可以直接使用ServletActionContext和ActionContext对象,代码片.

		//在struts中可以直接使用ServletActionContext对象,获取web的内置对象
		HttpServletRequest request=ServletActionContext.getRequest();
		HttpServletResponse response = ServletActionContext.getResponse();
		HttpSession session = request.getSession();
		ServletContext application = ServletActionContext.getServletContext();
		//ActionContext多种方法
		ActionContext context = ActionContext.getContext();
		ActionContext.put(key, value);== request中放值

总结

	1. 内容很多,需要注意的地方很多。
	2. 还有一些配置内容没有写,如action的类型,action类中的验证方法等。
**引用包是最大的困难(一步一步来)**
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值