文件编写配置文件
- 不分文件开发可能产生的问题
如果其中有一个提交代码之前不更新代码的话,就会将之前人更改的代码覆盖,导致代码丢失,所以要分文件开发 - 分文件编写Struts2的配置文件
struts.xml
struts.xml
参数封装
- 静态参数封装
- 当我们不写任何拦截器时,默认的拦截器栈defaultStack它来为我们工作。 但是,只要写了任何一个拦截器,默认的就全都不起作用了
- 使用注入的方式,给动作类的中的参数赋值
- 动态参数封装
- 第一种方式:动作类和实体类写在一起
- 底层是由params拦截器完成的
- 底层是由params拦截器完成的
- 第二种方式:动作类和实体类分开写
- 执行过程:
- 第一次执行get对象方法,框架判断该对象是否为null
- 对象不存在的时候,框架通过反射,把对象为我们创建出来
- 再调用get对象方法,得到对象,调用对应的set方法,为属性赋值
- 执行过程:
- 第三种方式:模型驱动
- 实现模型驱动的步骤:
- 实现一个ModelDriven的接口
- 实现接口中的抽象方法getModel()
- 在使用模型驱动的时候,数据模型必须由我们自己来实例化
- 是由一个ModelDriven的拦截器为我们做的(实际开发做的)
- 实现模型驱动的步骤:
- 第一种方式:动作类和实体类写在一起
数据类型转换
- 实际开发中用户通过浏览器输入的数据都是String或者String[]。
- String/String[]————填充模型(set方法)————>POJO(plain old java object) pojo中有java的数据类型。
- POJO————————获取(get方法)————>页面展示:String
- 类型转换情况
- 写数据:(增,删,改)都是String或String[]数组转换为其他类型。
- 读数据:(查)其他类型转换为String。
- Struts2提供的常用类型转换
- 基本数据类型自动转换。
- 日期类型:默认按照本地日期格式转换(yyyy-MM-dd)。
- 字符串数组:默认用逗号+空格,连接成一个字符串。
- 转换数据失败后的修正的步骤:
- 当转换失败后,页面提示上图
- 所以要配置回显结果视图
- 但是配置回显视图之后,返回页面发现,表单数据不见了,所以要使用struts2的标签库,用于写表单
- 返回的错误信息是英文的,想要中文提示,使用的是struts2的国际化。
- 在属性所在的类包下创建一个跟类包相同的属性文件,配置属性文件
- 当类型转换器当转换失败后,如何进入input视图的,是由一个叫做conversionError的拦截器完成的。 (要想使用类型转换中的错误处理,在定义Action时必须继承ActionSupport)
数据验证
- 编程式验证:
- 编写步骤:
- 动作类必须继承ActionSupport
- 重写validate方法(存入错误信息,直接调用父类的addFieldError方法,存入错误信息。第一个参数是表单name属性的值。第二个参数是错误提示)
- 编写问题:
- 但是如果我们再写一个动作的时候,validate()也会验证方法。所以validate会验证我们动作类中所有的动作方法,这就导致有些我们不需要验证的方法也会验证。
- 解决办法:
- 给不需要验证的方法上面添加一个@SkipValidation注解
- validation方法遵守书写规范:validate+动作方法名
- 弊端:硬编码,不够灵活,太过死板。
- 编写步骤:
- 声明式验证:
- 通过编写验证规则的xml文件。需要验证时,编写xml文件,不要验证,就不写。
- 针对动作类中的所有动作进行验证:在动作类所在的包中,建立一个ActionClassName-validation.xml的文件 (注意:它是针对动作类中的所有动作方法。)
- 针对动作类中的某个动作进行验证:在动作类所在的包中建立一个xml文件,名称为ActionClassName-ActionName-validation.xml。
- 案例演示:
Student.java
/**
* URL: uniform resource locator 统一资源定位符
* http://localhost:8080/day25_ee19_05struts2convert/register.jsp
* 协议 主机 端口 URI
* URI: uniform resource identifier 统一资源标识符
* /day25_ee19_05struts2convert/register.jsp
* @author zhy
*
*/
public class Student implements Serializable {
private String username;//不能为null和空字符串。要去空格
private int age;//整数,介于18-100之间
private String email;//按照邮箱的格式输入
private String password;//密码,长度是3~8位
private String repassword;//确认密码,必须和密码一致。写在这的目的,完全是为了演示验证器的使用。实际开发中根本不会保存确认密码
private int score;//成绩,必须是自然数
private String url;//个人主页:必须符合url格式。
private String gender;//性别
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getRepassword() {
return repassword;
}
public void setRepassword(String repassword) {
this.repassword = repassword;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
StudentAction.java
public class StudentAction extends ActionSupport implements ModelDriven<Student> {
private Student student = new Student();
public Student getModel() {
return student;
}
public String addStudent(){
return SUCCESS;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
}
addStudent.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%--导入struts2的标签库 --%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>用户注册,使用的是struts2的标签</title>
<s:head></s:head>
</head>
<body>
<s:actionerror/> <%--动作错误 --%>
<%--<s:fielderror /> 字段错误 --%>
<%--struts2的form标签,它提供了和原始html表单标签几乎一致的属性
action:请求的地址。直接写动作名称。不用写contextPaht
method:请求的方式。在这里不用写。struts2的form表单默认就是post
enctype:表单编码的MIME类型
--%>
<s:form action="addStudent.action">
<s:textfield name="username" label="用户名" />
<s:textfield name="age" label="年龄"/>
<s:textfield name="email" label="邮箱"/>
<s:textfield name="password" label="密码" />
<s:textfield name="repassword" label="确认密码"/>
<s:textfield name="score" label="成绩"/>
<s:textfield name="url" label="个人主页"/>
<%--list中的取值是生成一个list集合,并往集合中放入元素 --%>
<s:radio name="gender" list="{'男','女'}" label="性别"/>
<s:submit value="注册"/>
</s:form>
</body>
</html>
struts.xml
<!-- 声明式验证器案例的动作类配置 -->
<action name="addStudent" class="com.itheima.web.action.StudentAction" method="addStudent" >
<result name="input">/student.jsp</result>
</action>
StudentAction-addStudent-validation.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<field name="username">
<field-validator type="requiredstring">
<message>请输入用户名</message>
</field-validator>
</field>
<field name="age">
<field-validator type="int">
<!-- 使用注入的方式,设置最大和最小值 -->
<param name="min">18</param>
<param name="max">100</param>
<message>请输入18-100之间的整数</message>
</field-validator>
</field>
<field name="email">
<field-validator type="email">
<message>请输入正确的邮箱格式</message>
</field-validator>
</field>
<field name="password">
<field-validator type="requiredstring">
<!-- 注入取消使用trim -->
<param name="trim">false</param>
<message>请输入密码</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">3</param>
<param name="maxLength">8</param>
<message>密码长度是3~8位的</message>
</field-validator>
</field>
<!-- 确认密码和密码必须保持一致,是2个字段的事,所以要使用基于验证器的声明方式 -->
<validator type="expression">
<param name="expression">
<![CDATA[
password == repassword
]]>
</param>
<message>两次密码必须一致</message>
</validator>
<field name="score">
<field-validator type="regex">
<param name="regex">
\d+
</param>
<message>请输出正确的成绩</message>
</field-validator>
</field>
<field name="url">
<field-validator type="url">
<message>请输入正确的url地址</message>
</field-validator>
</field>
<field name="gender">
<!-- required是一个只验证是否null的内置验证器,不会去除空格 -->
<field-validator type="required">
<message>请选择性别</message>
</field-validator>
</field>
</validators>
总结
感觉优点晕还是要好好消化一下,再理一理。