马士兵struts2视频笔记--第二天

7、通配符的使用    
    7.1 index.jsp
    7.2 struts.xml
8、接收参数的三种方法 
    8.1 用Action的属性接收参数  
        8.1.1 index.jsp中超链接使用action属性接收参数
        8.1.2 UserAction.java中接收    
    8.2 用DomainModel接收参数(最常用)   
        8.2.1 index.jsp 
        8.2.2 struts.xml    
        8.2.3 UserAction.java   
        8.2.4 User.java(新增文件)   
    8.3 用ModelDriven接收参数    
        8.3.1 index.jsp和第一种传值一样。    
        8.3.2 UserAction.java   
9、中文乱码问题    
10、简单数据校验   
    10.1 添加验证   
    10.2 处理反馈信息 
    10.3 struts.xml 

7、通配符的使用

当类中方法的数量比较多时,方法中返回不同字符串,struts.xml中需要配置不同的<result name=”xxxx”></result>。使用通配符时,可以最大程度的减少配置,新建action和返回时的界面时,按照约定好的规则起名,配置文件不需要变更。

7.1 index.jsp

<?xml version="1.0" encoding="GB18030" ?>
<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>

<% String context = request.getContextPath(); %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030" />
<title>Insert title here</title>
</head>
<body>
使用通配符,将配置量降到最低<br />
<a href="<%=context %>/actions/Studentadd">添加学生</a>
<a href="<%=context %>/actions/Studentdelete">删除学生</a>
<br />
不过,一定要遵守"约定优于配置"的原则
<br />
<a href="<%=context %>/actions/Teacher_add">添加老师</a>
<a href="<%=context %>/actions/Teacher_delete">删除老师</a>
<a href="<%=context %>/actions/Course_add">添加课程</a>
<a href="<%=context %>/actions/Course_delete">删除课程</a>
    
</body>
</html>

注:前两个超链接’Studentadd’、’Studentdelete’中’Student’后面的部分对应通配符.

7.2 struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <constant name="struts.devMode" value="true" />
    <package name="actions" extends="struts-default" namespace="/actions">
        <action name="Student*" class="com.bjsxt.struts2.action.StudentAction" method="{1}">
            <result>/Student{1}_success.jsp</result>
        </action>
        
        <action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}">
            <result>/{1}_{2}_success.jsp</result>
            <!-- {0}_success.jsp -->
        </action>
    </package>
</struts>

注:①第一个action中,{1}对应第一个通配符’*’,比如在index.jsp中点击<a href="<%=context %>/actions/Studentadd">添加学生</a>,tomcat查询struts.xml,其中*对应add{1} 相当于add,动态拼接为字符串。
②第二个action中,’{1}’,’{2}’对应两个’*’,点击’index.jsp’中的<a href="<%=context %>/actions/Teacher_delete">删除老师</a>时,访问的action等价于

<action name="*_*"  class="com.bjsxt.struts2.action.TeacherAction" method="delete">
            <result>/Teacher_delete_success.jsp</result>

8、接收参数的三种方法

8.1 用Action的属性接收参数

8.1.1 index.jsp中超链接使用action属性接收参数

<a href="user/user!add?name=a&age=8">添加用户</a>

8.1.2 UserAction.java中接收

package com.bjsxt.struts2.user.action;

import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport {
    
    private String name;
    private int age;
    
    public String add() {
        System.out.println("name=" + name);
        System.out.println("age=" + age);
        return SUCCESS;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

8.2 用DomainModel接收参数(最常用)

与第一种相比,只是将属性封装到User类中,即model。

8.2.1 index.jsp

<?xml version="1.0" encoding="GB18030" ?>
<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>

<% 
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030" />
<base href="<%=basePath %>"/>
<title>Insert title here</title>
</head>
<body> 
<!—传值方式改变,用“对象.属性”形式-->
使用Domain Model接收参数<a href="user/user!add?user.name=a&user.age=8">添加用户</a>
    
</body>
</html>

8.2.2 struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <constant name="struts.devMode" value="true" />
    <package name="user" extends="struts-default" namespace="/user">
        
        <action name="user" class="com.bjsxt.struts2.user.action.UserAction">
            <result>/user_add_success.jsp</result>
        </action>
    </package>
</struts>

8.2.3 UserAction.java

package com.bjsxt.struts2.user.action;

import com.bjsxt.struts2.user.model.User;
import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport {
    
    private User user;//传值时不需要生成user对象,struts会自动调用构造器
    
    public String add() {
        System.out.println("name=" + user.getName());
        System.out.println("age=" + user.getAge());
        return SUCCESS;
    }

    public User getUser() {
        return user;
    }

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

8.2.4 User.java(新增文件)

package com.bjsxt.struts2.user.model;

public class User {
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
图8-1 用DomainModel接收参数.png

8.3 用ModelDriven接收参数

8.3.1 index.jsp和第一种传值一样。

<?xml version="1.0" encoding="GB18030" ?>
<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>

<% 
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030" />
<base href="<%=basePath %>"/>
<title>Insert title here</title>
</head>
<body> 
使用ModelDriven接收参数<a href="user/user!add?name=a&age=8">添加用户</a>
    
</body>
</html>

8.3.2 UserAction.java

package com.bjsxt.struts2.user.action;

import com.bjsxt.struts2.user.model.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

public class UserAction extends ActionSupport implements ModelDriven<User>{
    //需要自己手动创建对象
    private User user = new User();
    
    public String add() {
        System.out.println("name=" + user.getName());
        System.out.println("age=" + user.getAge());
        return SUCCESS;
    }

    @Override
    public User getModel() {
        return user;
    }
    
}

其他文件和之前的一样。

图 8-2用ModelDriven接收参数.png

9、中文乱码问题

** ①方法一:过滤器**
web.xml中配置过滤器为老版本的过滤器

<!-- <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> -->
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>

②方法二:直接更改编码

  • jsp文件前加上
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%>
    同时,struts.xml文件中指定解码类型
    <constant name="struts.i18n.encoding" value="UTF-8"></constant>

    解决get传值乱码的方法:修改tomcat配置文件server.xml
    <Connector port="8080" protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>

10、简单数据校验

10.1 添加验证

由8.1项目的基础上改进而来。在8.1.2 UserAction.add()方法里加上验证

if(name == null || !name.equals("admin")) {
            this.addFieldError("name", "name is error");
            this.addFieldError("name", "name is too long");
            return ERROR;
}

注:这里addFieldError可以将错误信息反馈到前端(传统servlet中有request和response,但是struts中的action没有这两个对象)。

10.2 处理反馈信息

使用addFieldError方法和s:fieldError标签简单处理数据校验

<?xml version="1.0" encoding="GB18030" ?>
<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030" />
<title>Insert title here</title>
</head>
<body>
    User Add Error!错误信息的两种取法s:fielderror  
    <s:fielderror fieldName="name" theme="simple"/>
    <br />
s:property  
    <s:property value="errors.name[1]"/>
    <s:debug></s:debug>
</body>
</html>

10.3 struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <constant name="struts.devMode" value="true" />
    <package name="user" extends="struts-default" namespace="/user">
        <action name="user" class="com.bjsxt.struts2.user.action.UserAction">
            <result>/user_add_success.jsp</result>
            <result name="error">/user_add_error.jsp</result>
        </action>
    </package>
</struts>
图10-1 运行结果.png

马士兵struts2视频笔记--第一天
马士兵struts2视频笔记--第二天
马士兵struts2视频笔记--第三天

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一. Java基础部分.................................................
    wy_sure阅读 3,874评论 0 11
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,839评论 18 399
  • 一、概念 Struts是流行和成熟的基于MVC设计模式的Web应用程序框架。使用Struts的目的:为了帮助我们减...
    yzw12138阅读 637评论 0 2
  • 每一个单恋的人都是孤独的城堡。 城堡前面每天都经过一列火车。 火车或许从南往北,或许从北到南。它可能上...
    石头男孩阅读 210评论 0 0
  • ――给自己一些“允许” 这几天都在为迎合领导的一个要求:短时间拿出一新学科教案而苦呕。...
    箫音声声阅读 202评论 0 0