Struts2--day02

非本人总结的笔记,抄点笔记复习复习。感谢传智博客和黑马程序猿


记笔记啊记笔记

结果页面的设置

在action标签里面有一个result标签
在result标签里面有属性name属性:根据action方法的返回值,配置到路径中
在result标签里面还有一个type属性:配置如何到路径中(重定向和转发...)
type属性值
dispatcher:转发操作到jsp页面中(默认值)
redirect:重定向操作到jsp页面中
chain:转发到action中
redirectAction重定向到action中
演示效果
在action中向request域设置值,分别设置result和type属性实现转发和重定向,到页面中获取request中的值。
如果转发,值可以获取到,访问路径不变
如果重定向,值不能获取到,访问路径改变

配置页面

创建action,TypeAction

package cn.itcast.type.action;

import javax.servlet.http.HttpServletRequest;


import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;
/**
 * 演示result标签的type配置
 * @author asus
 *
 */
public class TypeAction extends ActionSupport {

    @Override
    public String execute() throws Exception {
        //向request域设置值
        HttpServletRequest request = ServletActionContext.getRequest();
        request.setAttribute("req", "requestValuetype");
        return SUCCESS;
    }
}

配置action,struts.xml


        
            
            /type/type.jsp
        

创建结果页面,type.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>



  
    
    My JSP 'type.jsp' starting page

  
  
  
    request域值: ${requestScope.req }
  

局部结果页面和全局结果页面

比如:现在有两个action,这两个action都放回success,这两个success都是同一个结果页面 以前的做法,每个action都配置success页面
**配置全局结果页面,在所有的action如果返回success,而且都到同一个页面
在package里面使用标签


Struts2--day02_第1张图片
全局页面配置

局部结果页面,在action里面使用result标签配置
如果既配置了全局结果页面,又配合了局部结果页面,最终以局部结果页面为准


Struts2--day02_第2张图片
配置例子

Struts2封装数据的方式(获取表单数据)

前提:创建User类set和get方法,生成toString方法

package cn.itcast.bean;

public class User {

    //属性私有的
    private String username;
    private String password;
    //私有的属性通过公开的方法
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        return "User [username=" + username + ", password=" + password + "]";
    }
    
}

(1)传统方式获取表单数据

Javabean:就是Java类,遵循一定的书写规范

第一步 创建DateAction1

package cn.itcast.bean;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;
/**
 * 使用传统方式获取表单数据,封装到javabean中
 * @author asus
 *
 */
public class DataAction1 extends ActionSupport {

    @Override
    public String execute() throws Exception {
        //使用servletactionContext获取
        HttpServletRequest request = ServletActionContext.getRequest();
        //获取表单数据
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        //封装到javabean中
        User user = new User();
        user.setUsername(username);
        user.setPassword(password);
        System.out.println(user);
        return SUCCESS;
    }
}

第二步 配置action,struts.xml



    /index.jsp

第三步 创建form1页面

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>



  
    
    My JSP 'form1.jsp' starting page

  
  
  
    
username:
password:

(2)第一种:属性封装(在action中创建User类,不适合很多属性表单)

第一步 创建FieldAction

package cn.itcast.bean;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;
/**
 * 使用属性封装数据
 * @author asus
 *
 */
public class FieldAction extends ActionSupport {
//第一步.在action里面声明变量
//(变量名称和表单输入项的name属性值一样)
    private String username;
    private String password;
    //第二步.生成变量的set和get方法
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    
    @Override
    public String execute() throws Exception {
        System.out.println(username);
        System.out.println(password);
        return SUCCESS;
    }
}

第二步 配置action struts.xml



    /index.jsp

第三步 创建Form1页面

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>


  
    My JSP 'form1.jsp' starting page
  
  
  
    
username:
password:

(3)第二种:ognl表达式封装(直接把表单数据封装到Javabean里面)

第一步 创建OgnlAction

package cn.itcast.bean;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;
/**
 * 使用ognl表达式封装数据
 * @author asus
 *
 */
public class OgnlAction extends ActionSupport {

    //1.声明javabean
    private User user;
    //2.生成javabean的set和get方法
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }   
    @Override
    public String execute() throws Exception {
        System.out.println(user);
        return SUCCESS;
    }
}

第二步 配置action struts.xml



    /index.jsp

第三步 创建form2页面

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>



  
    
    My JSP 'form1.jsp' starting page

  
  
  
username:
password:

第三种:模型驱动封装(用的最多)创建Javabean对象

第一步 创建ModelAction 实现ModelDriven接口

package cn.itcast.bean;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
/**
 * 使用模型驱动方式封装数据
 * @author asus
 *
 */
   //接口里面使用泛型,写要封装到哪个javabean的名称
public class ModelAction extends ActionSupport implements ModelDriven{

    //创建javabean对象
    private User user = new User(); 
    //实现接口的方法
    //getModel方法里面return的值,创建的javabean对象
    public User getModel() {
        return user;
    }   
    @Override
    public String execute() throws Exception {
        System.out.println(user);
        return SUCCESS;
    }
}

第二步 配置action struts.xml



    /index.jsp

第三步 创建form3页面

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>



  
    
    My JSP 'form1.jsp' starting page

  
  
  
username:
password:

底层:模型驱动使用Struts2里面默认执行的拦截器

知识点:发送请求的时候,首先到过滤器里面,默认执行一系列拦截器,拦截器在struts-default.xml中配置

比较OGNL封装和模型驱动封装

共同点:都可以把数据封装到Javabean里面
不同点:
1、使用模型驱动只能向一个Javabean里面封装数据
2、使用OGNL表达式形式可以向多个Javabean里面封装数据,声明不同的Javabean

第一步:创建两个Javabean类

User类

package cn.itcast.bean;

public class User {

    //属性私有的
    private String username;
    private String password;
    //私有的属性通过公开的方法
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        return "User [username=" + username + ", password=" + password + "]";
    }
    
}

Person类

package cn.itcast.bean;

public class Person {

    private String address;

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

第二步:创建OgnlAction类

package cn.itcast.bean;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;
/**
 * 使用ognl表达式封装多个数据
 * @author asus
 *
 */
public class OgnlAction extends ActionSupport {

    //声明两个javabean
    private User user;
    private Person person;
    //生成javabean的set和get方法
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    public Person getPerson() {
        return person;
    }
    public void setPerson(Person person) {
        this.person = person;
    }
    
    @Override
    public String execute() throws Exception {
        System.out.println(user);
        System.out.println(person.getAddress());
        return SUCCESS;
    }
}

第三步:配置action,struts.xml



    /index.jsp

第四步:配置form页面

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>



  
    
    My JSP 'form1.jsp' starting page

  
  
  
    
username:
password:
address:

Struts2封装复杂数据(会用)

(1)封装数据到List集合

第一步 声明list集合

第二步 生成list集合的get和set方法

//声明list集合
private List list;
public List getList(){
      return list;
}
public void setList(List list) {
      this.list = list;
}

第三步 在表单页面中使用ognl表达式

username: 
  
Struts2--day02_第3张图片
MVC模型

Struts2的类型转换(了解)

在jsp页面中的数据,没有类型的概念,都可以显示到页面中,理解为字符串。
在action里面,变量有类型的概念,比如int、Date、String...

演示效果:
1.创建表单,输入姓名、年龄、生日
2.提交表单到action,在action中获取提交的数据

username:

age:
birthday:

页面中没有类型的概念,到action中把不同数据转换成对应的类型
封装数据

private String username;
private int age;
private Date birthday;

错误的效果
要求的age的类型是int类型,在页面输入的是abcd,不是int类型,在转换的过程中出现错误,自动返回使用名称为input


        /index.jsp
        /error.jsp

Date可以接收yyyy-MM-dd格式字符串

自定义类型转换器

实现步骤
把Date默认的格式yyyy-MM-dd,转换成yyyy/MM/dd

第一步:创建类,继承装换器类DefaultTypeConverter

SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
if(toType == Date.class) {
      String[] value_array = (String[])value;
      String s_value = value_array[0];
      try{
            Date date = sdf.parse(s_value);
            retrun date;
      } catch (ParseException e) {
            e.printStackTrace();
      }
} else {
      Date d = (Date) value;
      String times = sdf.format(d);
      return times;
}

第二步:配置类型转换器(注册类型转换器)

1、如果使用属性封装,在action所在的包里面,创建文件Action类名-conversion.properties

要转换的属性的名称=类型转换器类的全路径

birthday=cn.itcast.conerter.Myconverter

2、如果使用模型驱动封装,在Action类所在包创建javabean名-conversion.properties;

属性名称=类型转换器的全类名

birthday=cn.itcast.conerter.Myconverter

Struts2的数据校验

引入介绍

比如注册用户,在注册页面中输入信息,比如用户名,密码,年龄等等,
用户名不能为空,密码可能要求长度至少6位
这些操作称为数据的校验(表单校验)
之前进行数据的校验,在页面中使用js实现校验
如果在项目中单纯使用js校验,会有问题:
如果知道servlet的路径,不需要页面也可以把数据提交过去
http://127.0.0.1/web/servlet1?username=11&password=123
一般在实际开发中,双层校验,在页面中使用js校验,在servlet判断数据的格式
Struts2里面数据校验有两种方式:

第一种 手动写代码方式(手工代码校验请求参数)

实现过程:
重写actionsupport里面的validate方法,这个方法在execute方法之前执行,把校验逻辑写在这个歌validate方法里面

public void validate(){
      if(username == null || username.length() == 0) {
            this.addFiedError(username, "用户名不能为空");
      }
}

如果校验条件通过,返回视图名称input

/validate/demo1.jsp

在页面获取action里面通过addfielderror设置值
使用struts2标签


上面的操作是对action里面的所有方法进行校验
但是如果只是想要对某个方法进行校验
命名方式:validate要执行的方法名称首字母大写()

public void validateAdd() {
      if(username == null || username.length() == 0) {
            this.addFiedError(username, "用户名不能为空");
      }
 }

public String add() {
      return "add";
}

第二种 xml配置文件方式校验(重点)

第一个 对action里面所有方法进行校验

步骤一:编写页面demo3.jsp表单
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<%@ taglib uri="/struts-tags" prefix="s"%>




My JSP 'demo1.jsp' starting page




    
    
    
username:

步骤二:编写Action继承ActionSupport或者实现Validateable接口(Validatedemo3.java继承ActionSupport 使用xml校验必须提供get方法)

package cn.itcast.validation;

import com.opensymphony.xwork2.ActionSupport;
/**
 * xml配置方式校验
 */
public class ValidateDemo3 extends ActionSupport {

    private String username;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String execute() {
        return "success";
    }   
}

步骤三:在struts.xml中配置


        /index.jsp
        /validate/demo3.jsp

步骤四:编写校验规则xml文件

在Action所在包编写Action类名-validate.xml对Action所有业务方法进行校验






    
        
            用户名不能为空xml
        
    

default.xml内建校验器中常用的校验规则所在文件及解释


Struts2--day02_第4张图片
defalut.xml
  • required(必填校验器,要求被校验的属性值不能为null)
  • requiredstring(必填字符串校验器,要求被校验的属性值不能为null,并且长度大于0,默认情况下会对字符串去前后空格)
  • stringlength(字符串长度校验器,要求被校验的属性值必须在指定的范围内,否则校验失败,minLength参数指定最小长度,maxLength参数指定最大长度,trim参数指定校验field之前是否去除字符串前后的空格)
  • regex(正则表达式校验器,检查被校验的属性值是否匹配一个正则表达式,expression参数指定正则表达式,caseSensitive参数指定进行正则表达式匹配时,是否区分大小写,默认值为true)
  • int(整数校验器,要求field的整数值必须在指定范围内,min指定最小值,max指定最大值)
  • double(双精度浮点数校验器,要求field的双精度浮点数必须在指定范围内,min指定最小值,max指定最大值)
  • fieldexpression (字段OGNL表达式校验器,要求field满足一个ognl表达式,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过)
  • email(邮件地址校验器,要求如果被校验的属性值非空,则必须是合法的邮件地址)
  • url(网址校验器,要求如果被校验的属性值非空,则必须是合法的url地址)
  • date(日期校验器,要求field的日期值必须在指定范围内,min指定最小值,max指定最大值)
    案例:
    required 必填校验器

       性别不能为空!

requiredstring 必填字符串校验器


       true
       用户名不能为空!

stringlength:字符串长度校验器


    10
    2
    true
    

int:整数校验器


    1
    150
    年龄必须在1-150之间

date: 日期校验器


    1900-01-01
    2050-02-21
    生日必须在${min}到${max}之间

url: 网络路径校验器


    传智播客的主页地址必须是一个有效网址

email:邮件地址校验器


    电子邮件地址无效

regex:正则表达式校验器


     
     手机号格式不正确!

fieldexpression : 字段表达式校验


       
       两次密码输入不一致

第二个 对action指定的方法校验(update方法)

步骤一:编写demo4.jsp表单

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<%@ taglib uri="/struts-tags" prefix="s"%>




My JSP 'demo1.jsp' starting page




    
    
    
username:

步骤二:编写Action继承ActionSupport或者实现 Validateable 接口 (ValidateDemo4.java继承ActionSupport *使用xml校验 必须提供get方法)

package cn.itcast.validation;

import com.opensymphony.xwork2.ActionSupport;
/**
 * xml配置方式校验
 */
public class ValidateDemo4 extends ActionSupport {

    private String username;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    
    public String update() {
        return "success";
    }   
}

步骤三:在struts.xml中配置


        /index.jsp
        /validate/demo4.jsp

步骤四:编写校验规则xml文件

在action所在包里面创建xml文件,命名: Action类名-ActionName(元素name属性)-validation.xml


Struts2--day02_第5张图片
文件



    
        
            用户名不能为空updatexml
        
    

你可能感兴趣的:(Struts2--day02)