十三.静态参数和动态参数的封装
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)存在的目录下新建一个同名的配置文件,并写入相关配置信息即可
再看结果: