14通配符问题

其实这个问题看一个例子就ok

    <package name="actions" extends="struts-default" namespace="/">
        <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>
        </action>   

    </package>

例如当我访问 http://localhost:8900/BJSXT_struts2/Teacher_delete

struts就会匹配第二个action,name里面有两个* 很清楚的 第一个*对应着Teacher第二个*对应这个delete

那么要找到类就是com.bjsxt.struts2.action.TeacherAction

调用的方法就是上面那个类的里面的delete方法

返回调用的jsp就是 Teacher_delete_success.jsp

第一个Student*就不用说了吧

类如下

package com.bjsxt.struts2.action;

import com.opensymphony.xwork2.ActionSupport;

public class TeacherAction extends ActionSupport {
	public String add() {
		return SUCCESS;
	}
	public String delete() {
		return SUCCESS;
	}
}

项目图如下

其中Studentadd_success.jsp 里面就显示"添加学生成功" 其余三个类似

15-17 action接受参数

有三种方式

第一种

url 如此写 http://localhost:8900/BJSXT_struts2/user/user!add?age=15&name=a

struts.xml如下

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

类如下

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;
	}
}
//省略get/set方法

第二种方法

url如下

http://localhost:8900/BJSXT_struts2/user/user!add?user.name=a&user.age=8

与第一种方法相比 参数被封装了起来

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;
	public String add() {
		System.out.println("name=" + user.getName());
		System.out.println("age=" + user.getAge());
		return SUCCESS;
	}
}
//省略get/set方法 User类也就是两个属性 及相应的getset方法也不再赘述

struts.xml不变

这里就出现了一个问题 如果我给User这个类里面加上一个参数或两个参数的构造函数会怎么样呢?

大家可以自己试试 会报如下的错

java.lang.InstantiationException: com.bjsxt.struts2.model.User

InstantiationException 实例化错误!!

奇怪了 如果我把构造函数都去掉 由一切ok

问题就是 我们忘掉了关于构造函数最基本的几个知识点

当一个类没有构造函数的时候 编译器会自动为它增加一个参数为空 内部什么都不写的构造函数

如果我们给类加了构造函数 那么编译器就不管了

而struts是通过无参的构造函数来实例化user这个对象的 你自己写了构造函数 让struts情何以堪??

所以两个解决方案 要么去掉加上的构造函数 要么就再加一个无参的构造函数

另一方面如果user里面的参数和传过来的参数数目不匹配 可以加上一个UserDto类做中间转换

第三种方法的url和struts.xml与第一种的一样

不一样的是类

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

}

这里有三个要注意的地方

1:实现了ModelDriven接口,(要写清楚类型!)

2user对象要初始化

3要有getModel的方法.

其实最经常用的是第二种方法 第一种与第三种方法用的较少 但是我们应该明白三种方法的内部原理

尚学堂马士兵struts2 课堂笔记(二)的更多相关文章

  1. 尚学堂马士兵struts2 课堂笔记(一)

    06_尚学堂马士兵_Struts2_Struts2_HelloWorld_5 <constant name="struts.devMode" value="true ...

  2. 尚学堂马士兵struts2 课堂笔记(四)

    27 结果类型 主要就四种种 dispatch和rediret chain和drdirectaction <package name="resultTypes" namesp ...

  3. 尚学堂马士兵struts2 课堂笔记(三)

    19-20 简单数据验证 例如 前台jsp 及struts.xml <a href="user/user!add?name=a" >添加用户</a> < ...

  4. 尚学堂马士兵Oracle教程笔记

    检查Oracle安装 首先,以超级管理员的身份登录oracle sqlplus sys/bjsxt as sysdba 然后,解除对scott用户的锁 alter user scott account ...

  5. struts2学习笔记二

    一.分文件编写框架配置文件 1.不分文件开发可能产生的问题 就类似于我们在写java类时,所有代码都写在一个类里,甚至写在一个方法里. 当3个人都checkout了struts.xml文件时,第一个人 ...

  6. Struts2.0笔记二

    Mvc与servlet 1.1   Servlet的优点 1.  是mvc的基础,其他的框架比如struts1,struts2,webwork都是从servlet基础上发展过来的.所以掌握servle ...

  7. Struts2学习笔记(二):第一个Struts2应用

    一.创建Action类. 创建工程Struts2Demo struts 2中的Action类并不需要继承struts 2中的某个父类,普遍的java类就可以. 在org.sunny.user.acti ...

  8. Struts2学习笔记二 配置详解

    Struts2执行流程 1.简单执行流程,如下所示: 在浏览器输入请求地址,首先会被过滤器处理,然后查找主配置文件,然后根据地址栏中输入的/hello去每个package中查找为/hello的name ...

  9. Struts2学习笔记二:开发流程

    一:创建项目,添加依赖包 二:在web.xml配置核心控制器 <filter> <filter-name>struts2</filter-name> <fil ...

随机推荐

  1. Ajax来实现下拉框省市区三级联动效果(服务端基于express)

    //服务端JS代码: //提供服务端的处理 const express = require('express'); const fs = require('fs'); const app = expr ...

  2. JS运行机制之 Event Loop 的思考

    先举个栗子,如下: for (var i = 0; i < 5; i++) { setTimeout(function() { console.log('i: ',i); //一秒之后输出几乎没 ...

  3. 2018 dnc 公司案例大全,迎接.NET Core开源新时代

    2018 dnc 公司案例大全,迎接.NET Core开源新时代   dnc = .NET Core.dotnet Core dnc是微软新一代主力编程平台,开源.免费.跨平台.轻量级.高性能,支持L ...

  4. ObjectOutputStream 和 ObjectInputStream的使用

    一.看一下API文档 ObjectOutputStream : ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream.可以使用 ObjectInp ...

  5. 对于给定的整数集合S,求出最大的d,使得a+b+c=d。

    对于给定的整数集合S,求出最大的d,使得a+b+c=d.a,b,c,d互不相同,且都属于S.集合的元素个数小于等于2000个,元素的取值范围在[-2^28,2^28 - 1],假定可用内存空间为100 ...

  6. 记住经典的斐波拉契递归和阶乘递归转换为while规律

    记住经典的斐波拉契递归和阶乘递归转换为while规律.它为实现更复杂转换提供了启发性思路. # 斐波拉契--树形递归 def fab(n): if n<3: return n return fa ...

  7. [ExtJS5学习笔记]第三十三节 sencha extjs 5 grid表格导出excel

    使用extjs肯定少不了使用表格控件,用到表格,领导们(一般)还是惯于使用excel看数据,所以用到extjs表格的技术猿们肯定也会有导出表格excel这一个需求,本文主要针对如何在用extjs将gr ...

  8. 使用C++将OpenCV中Mat的数据写入二进制文件,用Matlab读出

    在使用OpenCV开发程序时,如果想查看矩阵数据,比较费劲,而matlab查看数据很方便,有一种方法,是matlab和c++混合编程,可以用matlab访问c++的内存,可惜我不会这种方式,所以我就把 ...

  9. 漏洞挖局利器-Fuzz技术介绍

    模糊测试的定义 模糊测试定义为"通过向应用提供非预期的输入并监控输出中的异常来发现软件中的故障(faults)的方法". 典型而言,模糊测试利用自动化或是半自动化的方法重复地向应用 ...

  10. SQLite 表达式(http://www.w3cschool.cc/sqlite/sqlite-expressions.html)

    SQLite 表达式 表达式是一个或多个值.运算符和计算值的SQL函数的组合. SQL 表达式与公式类似,都写在查询语言中.您还可以使用特定的数据集来查询数据库. 语法 假设 SELECT 语句的基本 ...