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>
说明
- < 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 >你的用户名长度必须在4到20之间,且必须是字母和数字</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>
说明
- 校验失败自动显示在原界面。
- 和校验类在一个目录内。
- 校验文件的命名方式:类名-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类中的验证方法等。
**引用包是最大的困难(一步一步来)**