Struts学习笔记(三)

文件编写配置文件

  1. 不分文件开发可能产生的问题
    在这里插入图片描述
    如果其中有一个提交代码之前不更新代码的话,就会将之前人更改的代码覆盖,导致代码丢失,所以要分文件开发
  2. 分文件编写Struts2的配置文件
    struts.xml在这里插入图片描述
    struts.xml在这里插入图片描述

参数封装

  1. 静态参数封装
    • 当我们不写任何拦截器时,默认的拦截器栈defaultStack它来为我们工作。 但是,只要写了任何一个拦截器,默认的就全都不起作用了
    • 使用注入的方式,给动作类的中的参数赋值
      在这里插入图片描述
  2. 动态参数封装
    • 第一种方式:动作类和实体类写在一起
      • 底层是由params拦截器完成的
        在这里插入图片描述
        在这里插入图片描述在这里插入图片描述
        在这里插入图片描述
    • 第二种方式:动作类和实体类分开写
      在这里插入图片描述在这里插入图片描述
      在这里插入图片描述
      • 执行过程:
        • 第一次执行get对象方法,框架判断该对象是否为null
        • 对象不存在的时候,框架通过反射,把对象为我们创建出来
        • 再调用get对象方法,得到对象,调用对应的set方法,为属性赋值
    • 第三种方式:模型驱动
      • 实现模型驱动的步骤:
        • 实现一个ModelDriven的接口
        • 实现接口中的抽象方法getModel()
        • 在使用模型驱动的时候,数据模型必须由我们自己来实例化
      • 是由一个ModelDriven的拦截器为我们做的(实际开发做的)
        在这里插入图片描述
        在这里插入图片描述
        在这里插入图片描述

数据类型转换

  1. 实际开发中用户通过浏览器输入的数据都是String或者String[]。
    • String/String[]————填充模型(set方法)————>POJO(plain old java object) pojo中有java的数据类型。
    • POJO————————获取(get方法)————>页面展示:String
  2. 类型转换情况
    • 写数据:(增,删,改)都是String或String[]数组转换为其他类型。
    • 读数据:(查)其他类型转换为String。
  3. Struts2提供的常用类型转换
    • 基本数据类型自动转换。
    • 日期类型:默认按照本地日期格式转换(yyyy-MM-dd)。
    • 字符串数组:默认用逗号+空格,连接成一个字符串。
  4. 转换数据失败后的修正的步骤:
    在这里插入图片描述
    • 当转换失败后,页面提示上图
    • 所以要配置回显结果视图
      在这里插入图片描述
    • 但是配置回显视图之后,返回页面发现,表单数据不见了,所以要使用struts2的标签库,用于写表单
    • 返回的错误信息是英文的,想要中文提示,使用的是struts2的国际化。
    • 在属性所在的类包下创建一个跟类包相同的属性文件,配置属性文件
      在这里插入图片描述
    • 当类型转换器当转换失败后,如何进入input视图的,是由一个叫做conversionError的拦截器完成的。 (要想使用类型转换中的错误处理,在定义Action时必须继承ActionSupport)

数据验证

  1. 编程式验证:
    • 编写步骤:
      • 动作类必须继承ActionSupport
      • 重写validate方法(存入错误信息,直接调用父类的addFieldError方法,存入错误信息。第一个参数是表单name属性的值。第二个参数是错误提示)
        在这里插入图片描述
    • 编写问题:
      • 但是如果我们再写一个动作的时候,validate()也会验证方法。所以validate会验证我们动作类中所有的动作方法,这就导致有些我们不需要验证的方法也会验证。
      • 解决办法:
        • 给不需要验证的方法上面添加一个@SkipValidation注解
        • validation方法遵守书写规范:validate+动作方法名
          在这里插入图片描述
    • 弊端:硬编码,不够灵活,太过死板。
  2. 声明式验证:
    • 通过编写验证规则的xml文件。需要验证时,编写xml文件,不要验证,就不写。
    • 针对动作类中的所有动作进行验证:在动作类所在的包中,建立一个ActionClassName-validation.xml的文件 (注意:它是针对动作类中的所有动作方法。)
      在这里插入图片描述
    • 针对动作类中的某个动作进行验证:在动作类所在的包中建立一个xml文件,名称为ActionClassName-ActionName-validation.xml。
      在这里插入图片描述
  3. 案例演示:
    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>

总结

感觉优点晕还是要好好消化一下,再理一理。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值