总结 15/4/20

一、复习

1.复习xml的基本内容

2.DTD约束:Xml文件使用DOCTYPE声明语句来指明它所遵循的DTD文件,DOCTYPE声明语句有两种形式:

(1).当引用的文件在本地时,采用如下方式:

<!DOCTYPE  文档根节点  SYSTEM  “DTD文件的URI” >

(2).当引用的文件是一个公共的文件时,采用如下方式:

<!DOCTYPE  文档根节点  PUBLIC  “DTD名称”  “DTD文件产URL” >

3.DTD约束语法

在DTD文档中使用ELEMENT声明一个xml元素,语法格式如下:

<!ELEMENT  元素名称 元素类型>

元素类型可以是元素内容、或类型

如为元素内容:则需要使用()括起来,如

<!ELEMENT  学校  (班级,老师,学生人数)>

<!ELEMENT  班级  (#PCDATA)>

如为元素类型,则直接书写,DTD规范定义了如下几种类型:

EMPTY:用于定义空元素,例如<br/>  <hr/>

ANY:表示元素内容为任意类型。

在元素内容中也可以使用+、*、?等符号表示元素出现的次数:

+:一次或多次(班级+)

?:0次或一次(班级?)

*:0次或多次(班级*)

设置说明:

#REQUIRED:必须设置该属性。

#IMPLIED:可设置也可不设置。

#FIXED:说明该属性的取值固定为一个值,在xml文件中不能为该属性设置其它值,但需要为该属性提供这个值。

直接使用默认值:在xml中可以设置该值也可以不设置该属性值。若没设置则使用默认值。

CDATA:普通文本字符串类型。

#PCDATA:该内容模型说明元素中可以同时出现文本和元素。

ENUMERATED:枚举类型。

ENTITY:实体类型

2.xml解析方式分为两种:dom和sax

dom:将整个文档读入到内存中,作为一个完整的document对象,优点:对文档的增删改查比较方便,缺点:占用内存大

sax:优点:占用内存下,解析速度快。缺点:只适合做文档的读取

3.dom和dom4j的crud 收获:

在删除节点的时候,首先取得这个节点,然后在获取这个节点的父节点,在调用父节点的方法删除这个节点,最后将内存中的document对象写入到文档中。

dom删除节点:

Element p2 = (Element)document.getElementsByTagName("p").item(1);
p2.getParentNode().removeChild(p2);

dom4j删除节点:

Element p1 = document.getRootElement().element("body").element("p");
p1.getParent().remove(p1);

二、struts2的新内容(视频笔记)

I.struts2执行前半过程:
1.浏览器发送一个请求到StrutsPrepareAndExecuteFilter.doFilter(ServletRequest, ServletResponse, FilterChain)方法
2.创建一个StrutsActionProxy(StrutsAction代理),然后调用它的execute()(execute方法是用作Action调用的入口函数)方法,这个对象有一个对DefaultActionInvocation的引用
调用其invoke()方法
3.DefaultActionInvocation去调用其他拦截器的intercept()方法 ,调用完之后回调DefaultActionInvocation的invoke()方法,再调用
下一个拦截器的intercept()方法,如此反复,到了最后一个拦截器掉完以后,在调用自己的invokeAction()方法,最终调用我们目标的Action()方法

StrutsActionProxy(action代理的作用):Action的调用是通过ActionProxy实现的,其实就是调用了ActionProxy的execute()方法
而该方法又调用了DefaultActionInvocation的invoke()方法

ActionInvocation就是Action的调用者。ActionInvocation在Action的执行过程当中,负责interceptor(拦截器).Action和Result等一系列元素的调度

II.Parameters  和 ModelDriven拦截器
1.Parameters 拦截器将把表单字段映射到ValueStack栈的栈顶对象的各个属性中,如果某个字段在模型里没有匹配的属性,param拦截器将会尝试ValueStack栈中的下一个对象

2.如果Action类实现了ModelDriven接口,则该ModelDriven拦截器将把ModelDriven接口的getModel()方法返回的对象置于栈顶

3.Action 实现 ModelDriven接口后的运行流程

1).先会执行ModelDrivenInterceptor的intercept方法

public String intercept(ActionInvocation invocation) throws Exception {

//获取Action对象:EmployeeAction 对象,此时该Action已经实现了ModelDriver接口

//public class EmployeeAction implements RequestAware,ModelDriven<Employee>

Object action = invocation.getAction();

//判断Action是否是ModelDriven的实例

if (action instanceof ModelDriven) {

//强制转换为ModelDriven类型
ModelDriven modelDriven = (ModelDriven) action;

//获取值栈
ValueStack stack = invocation.getStack();

//调用ModelDriven接口的getModel()方法

//即调用EmployeeAction 的getModel()方法
Object model = modelDriven.getModel();
if (model != null) {

//把getModel()返回的值压入到值栈的栈顶,实际上压入的是EmployeeAction的employee成员变量 
stack.push(model);
}
if (refreshModelBeforeResult) {
invocation.addPreResultListener(new RefreshModelBeforeResult(modelDriven, model));
}
}
return invocation.invoke();
}

2).执行ParametersInterceptor的intercept方法:把请求参数的值赋值给栈顶元素对应的属性,若栈顶元素没有对应的属性,则查询值栈中下一个对应的属性

体会:将employee成员变量压入到栈顶,并且通过ParametersInterceptor的intercept方法将前台传进来的值赋给employee的变量,而且在EmployeeAction中得到了这个经过赋值的employee变量,接下来就可以进行一系列操作,大大减少了代码长度,Action写起来比较简单

时间: 2024-10-26 13:05:13

总结 15/4/20的相关文章

js如何判断一组数字是否连续,得到一个临时数组[[3,4],[13,14,15],[17],[20],[22]];

var arrange = function(arr){ var result = [], temp = []; arr.sort(function(source, dest){ return source - dest; }).concat(Infinity).reduce(function(source, dest){ temp.push(source); if(dest-source>1){ result.push(temp); temp = []; } return dest; });

城府 (2012-03-14 15:22:20)

比喻令人难以揣测的深远用心. 随着年龄的增长,小学,中学,大学;学得知识不断增多;走向社会,经过许许多多事件的磨练,该忍的忍住了,该等的等起了.不再会怒形于色,不再会声嘶力竭,更不再会气急败坏了.这说明城府已由浅入深. 城府标志在一个人的言行上. 城府是人的一种功力,内敛而不外露的功力.

循环-20. 猜数字游戏(15)

1 #include<iostream> 2 using namespace std; 3 int main(){ 4 int a,n,g,i=1; 5 cin>>a>>n; 6 while(cin>>g){ 7 if(i>n||g<0){ 8 cout<<"Game Over"<<endl; 9 break; 10 } 11 else{ 12 if(g>a) 13 cout<<&qu

Linux 第15天: (08月29日) Linux高级文件系统管理

本章内容设定文件系统配额设定和管理软RAID设备配置逻辑卷设定LVM快照btrfs文件系统 配置配额系统综述在内核中执行以文件系统为单位启用对不同组或者用户的策略不同根据块或者节点进行限制执行软限制(soft limit)硬限制(hard limit)初始化分区挂载选项:usrquota.grpquota初始化数据库:quotacheck 为用户设定配额执行开启或者取消配额:quotaon.quotaoff直接编辑配额:edquota username在shell中直接编辑:setquota u

高级文件系统管理——Linux基本命令(15)

1.配置配额 (1)初始化 分区挂载选项:usrquota.grpquota(用户挂载,组挂载) 初始化数据库:quotacheck -cug /home (2)执行 开启或者取消配额功能:quotaon.quotaoff (开启之后发现就无法删除了,被保护了) 直接编辑配额:edquota -u/g username(对用户.对组做配额限制) 分别对文件的大小和数量进行限制.软限制就是可以允许超过软限制会发出警告,而硬限制不允许超过.因此设置的时候,软应该小于硬. 在shell中直接编辑: s

JavaSE学习总结第20天_IO流2

20.01  递归概述和注意事项 递归:方法定义中调用方法本身的现象 递归注意事项: 1.要有出口,否则就是死递归 2.次数不能太多,否则就内存溢出 3.构造方法不能递归使用 20.02  递归求阶乘的代码实现及内存图解 例: 1 public class Practice 2 { 3 public static void main(String[] args) 4 { 5 System.out.println(jieCheng(5)); 6 } 7 public static int jieC

黑马程序员_JavaSE学习总结第20天_IO流2

------- android培训.java培训.期待与您交流! ----------  20.01  递归概述和注意事项 递归:方法定义中调用方法本身的现象 递归注意事项: 1.要有出口,否则就是死递归 2.次数不能太多,否则就内存溢出 3.构造方法不能递归使用 20.02  递归求阶乘的代码实现及内存图解 例: 1 public class Practice 2 { 3 public static void main(String[] args) 4 { 5 System.out.print

CSharpGL(15)用GLSL渲染2种类型的文字

CSharpGL(15)用GLSL渲染2种类型的文字 下载 这个示例是CSharpGL的一部分,CSharpGL已在GitHub开源,欢迎对OpenGL有兴趣的同学加入(https://github.com/bitzhuwei/CSharpGL) 血条 玩家头顶的血条.名字随着玩家在3D世界移动,但始终朝向摄像机,且在屏幕上的大小不变. 始终朝向camera 如何使模型始终朝向camera? 对模型进行坐标变换,使模型的顶点坐标从物体坐标系变换到世界坐标系再到屏幕坐标系.这过程需要三个矩阵. 1

12.13 Nginx防盗链 12.14 Nginx访问控制 12.15 Nginx解析php相关配

12.13 Nginx防盗链 vim /usr/local/nginx/conf/vhost/test.com.conf加入location ~ ^.+.(gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|bz2|jpeg|bmp|xls)${expires 7d;valid_referers none blocked server_names .test.com ;if ($invalid_referer) {return 403;}access_log off;}