Struts2框架(五)

十三.静态参数和动态参数的封装

13.1 如何封装静态请求参数

struts.xml文件中的配置

<action name="action1" class="com.itheima.web.action.Demo1Action" method="addUser">
            <!-- 当我们不写任何拦截器时,默认的拦截器栈defaultStack它来为我们工作。
                 但是,只要写了任何一个拦截器,默认的就全都不起作用了 -->
            <!-- 使用注入的方式,给动作类的中的参数赋值 -->
            <param name="username">张三</param>
            <param name="age">18</param>
        </action>

Action文件

package com.itheima.web.action;

import com.opensymphony.xwork2.ActionSupport;
/**
 * 静态参数封装
 * @author zhy
 *
 */
public class Demo1Action extends ActionSupport {

    private String username;
    private int age;


    public String addUser(){
        System.out.println(username+","+age);
        return null;//不返回任何结果视图   NONE常量
    }


    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;
    }


}

13.2 如何封装动态请求参数

  • 动态参数封装,第一种情况:数据模型与动作类写在一起
    jsp文件
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>动态参数封装</title>
  </head>
  <body>
    <form action="${pageContext.request.contextPath}/action2.action" method="post">
        <%--表单中的name属性取值必须和动作类中数据模型的set方法后面的名称一致。 --%>
        用户名:<input type="text" name="username" /><br/>
        年龄:<input type="text" name="age"/><br/>
        <input type="submit" value="提交" />
    </form>
  </body>
</html>

struts.xml文件中的配置

<!-- 动态参数封装的第一种形式的配置 -->
        <action name="action2" class="com.itheima.web.action.Demo2Action" method="addUser"></action>

Action文件

package com.itheima.web.action;

import com.opensymphony.xwork2.ActionSupport;
/**
 * 动态参数封装,第一种情况:
 *      数据模型与动作类写在一起
 * @author zhy
 *
 */
public class Demo2Action extends ActionSupport {

    private String username;
    private int age;


    public String addUser(){
        System.out.println(username+","+age);
        return null;//不返回任何结果视图   NONE常量
    }


    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;
    }


}
  • 动态参数封装,第二种情况:数据模型与动作类分开写
    jsp文件
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>动态参数封装</title>
  </head>
  <body>
    <form action="${pageContext.request.contextPath}/action3.action" method="post">
        <%--表单中的name属性取值必须和动作类中数据模型的set方法后面的名称一致。 --%>
        用户名:<input type="text" name="user.username" /><br/>
        年龄:<input type="text" name="user.age"/><br/>
        <input type="submit" value="提交" />
    </form>
  </body>
</html>

struts.xml中的配置

<!-- 动态参数封装的第二种形式的配置 -->
        <action name="action3" class="com.itheima.web.action.Demo3Action" method="addUser"></action>

user文件

package com.itheima.domain;

import java.io.Serializable;

public class User implements Serializable {

    private String username;
    private int age;
    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;
    }



}

Action文件

package com.itheima.web.action;

import com.itheima.domain.User;
import com.opensymphony.xwork2.ActionSupport;
/**
 * 动态参数封装,第二种情况:
 *      数据模型与动作类分开写
 * @author zhy
 *
 */
public class Demo3Action extends ActionSupport {

    //定义数据模型对象
    private User user = new User();

    public String addUser(){
        System.out.println(user.getUsername()+","+user.getAge());
        return null;//不返回任何结果视图   NONE常量
    }

    public User getUser() {
        System.out.println("getUser");
        return user;
    }

    public void setUser(User user) {
        System.out.println("setUser");
        this.user = user;
    }




}
  • 动态参数封装,第三种情况:模型驱动
    要想使用模型驱动,必须数据模型与动作类分开写
    user文件
package com.itheima.domain;

import java.io.Serializable;

public class User implements Serializable {

    private String username;
    private int age;
    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;
    }



}

struts.xml中的配置

<!-- 动态参数封装的第三种形式的配置 -->
        <action name="action4" class="com.itheima.web.action.Demo4Action" method="addUser"></action>

Action文件

package com.itheima.web.action;

import com.itheima.domain.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
/**
 * 动态参数封装,第三种情况:模型驱动
 *      要想使用模型驱动,必须数据模型与动作类分开写
 * 实现模型驱动的步骤:
 *      1.实现一个ModelDriven的接口
 *      2.实现接口中的抽象方法getModel()
 *      3.在使用模型驱动的时候,数据模型必须由我们自己来实例化
 * 
 * 是由一个ModelDriven的拦截器为我们做的
 * 
 * 实际开发中采用的方式
 * @author zhy
 *
 */
public class Demo4Action extends ActionSupport implements ModelDriven<User>{

    //定义数据模型对象
    private User user = new User() ;//使用模型驱动,必须自己实例化模型对象


    //该方法返回的是数据模型
    public User getModel() {
        return user;
    }

    public String addUser(){
        System.out.println(user.getUsername()+","+user.getAge());
        return null;//不返回任何结果视图   NONE常量
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }






}

jsp文件

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>动态参数封装</title>
  </head>
  <body>
    <form action="${pageContext.request.contextPath}/action4.action" method="post">
        <%--需要注意name属性的取值,已经不是一个普通的字符串了 --%>
        用户名:<input type="text" name="username" /><br/>
        年龄:<input type="text" name="age"/><br/>
        <input type="submit" value="提交" />
    </form>
  </body>
</html>

十四.Struts2表单标签的使用

14.1 表单标签使用

  • 导入Struts2的标签库
<%@ taglib uri="/struts-tags" prefix="s" %>

uri就是Struts2标签库的URI,prefix属性值是该标签库的前缀

  • 表单标签
<s:actionerror/><%-- 动作错误 --%>
    <s:fielderror /><%-- 字段错误 --%>
    <%--struts2的form标签,它提供了和原始html表单标签几乎一致的属性
        action:请求的地址。直接写动作名称。不用写contextPaht
        method:请求的方式。在这里不用写。struts2的form表单默认就是post
        enctype:表单编码的MIME类型
    --%>
    <s:form action="register.action">
        <s:textfield name="username" label="用户名" requiredLabel="true" requiredPosition="left"/>
        <s:password name="password" label="密码" showPassword="true"/>
        <s:textfield name="birthday" label="生日"/>
        <s:submit value="注册"/>
    </s:form>

14.2 Struts2 错误处理和中文显示

举个小例子:
用户注册界面:

<%@ 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="register.action">
        <s:textfield name="username" label="用户名" requiredLabel="true" requiredPosition="left"/>
        <s:password name="password" label="密码" showPassword="true"/>
        <s:textfield name="birthday" label="生日"/>
        <s:submit value="注册"/>
    </s:form>
  </body>
</html>

这里使用的是Struts2的表单标签

Structs.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <constant name="struts.devMode" value="true"/>
    <package name="p1" extends="struts-default">
        <action name="register" class="com.itheima.web.action.UserAction" method="register" >
            <result type="redirect">/success.jsp</result><!-- 当注册成功之后重定向的结果视图 -->
            <result name="exists">/message.jsp</result><!-- 当用户名已经存在之后,转向的结果视图 -->
            <!-- 当出现问题之后,需要从哪来回哪去 -->
            <result name="input">/register1.jsp</result>
        </action>
    </package>
</struts>

Action文件

package com.itheima.web.action;

import com.itheima.domain.User;
import com.itheima.service.IUserService;
import com.itheima.service.impl.UserServiceImpl;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
/**
 * 用户操作相关的动作类
 * @author zhy
 *
 */
public class UserAction extends ActionSupport implements ModelDriven<User> {

    private IUserService service = new UserServiceImpl();

    //定义一个用户的数据模型,注意:由于使用了模型驱动,我们必须自己实例化对象
    private User user = new User();

    public User getModel() {
        return user;
    }

    public String register(){
        //1.根据用户名获取数据库的用户对象
        User dbUser = service.findUserByUsername(user.getUsername());
        //2.判断对象是否存在
        if(dbUser != null){
            //2.1如果存在,则表明用户有了,返回exists的结果视图
            return "exists";
        }
        //3.不存在,保存用户信息
        int res = service.register(user);
        //4.如果执行结果大于0
        if(res > 0){
            return SUCCESS;
        }
        //5.如果不大于0,返回null
        return null;
    }


    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }



}

bean :User

package com.itheima.domain;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable {

    private String username;
    private String password;
    private Date birthday;
    private String hobby;
    private boolean married;
    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;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    public String getHobby() {
        return hobby;
    }
    public void setHobby(String hobby) {
        this.hobby = hobby;
    }
    public boolean isMarried() {
        return married;
    }
    public void setMarried(boolean married) {
        this.married = married;
    }


}

当访问注册页面,将日期的格式填写错误
日期格式错误
此时出现错误提示信息,这是使用了Struts2的标签库的原因,但是我们如何将提示信息变成中文呢?
我们只需要在对应的bean(User)存在的目录下新建一个同名的配置文件,并写入相关配置信息即可
配置文件
再看结果:
中文错误提示

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值