Hibernate的检索策略

Hibernate的检索策略

1.目的:了解Hibernate针对提升应用程序的性能所设计的一些已有的策略。这些策略通常都是已hbm文件中的配置体现的。

2.提升性能
     ①让数据尽可能晚的进入内存,以节约内存空间。
          双向一对多:加载Customer对象,如果同时将关联的Order集合也加载到内存中,但又没有使用Order集合数据,那么这种情况下,就浪费了内存的空间。
     ②让应用程序少发送SQL语句访问数据库。
          将两次查询合并为一次“左外连接”的方式查询,减少发送的SQL语句。
3.类级别的检索策略
     ①不牵扯关联关系,仅仅考虑一个类的一个对象的加载情况。
     ②只能影响到load()方法的行为。
     ③默认情况下采用延迟检索策略,如果在hbm文件的class元素内设置lazy=false则采用立即检索策略。
4.从一个持久化对象中加载关联的Set集合
     ①双向多对一情况
          Customer.getOrders();
     ②双向/单向多对多情况
          Teacher.getStudents();
     ③set元素的属性设置
          [1]lazy属性
               (1)默认值:true,表示采用延迟检索策略
               (2)false:表示采用立即检索策略
               (3)extra:表示采用“超级”懒加载,具体体现为:能够使用某些聚合函数实现的查询就不进行全部数据的查询
          [2]batch-size属性
               表示将内存中的集合一次初始化的个数
          [3]fetch属性
               subselect:以子查询的方式初始化所有关联的集合对象,忽略batch-size属性的设置
               join:可以在查询Customer对象的时候就以“迫切左外连接”的方式查询关联的Order集合
                    迫切左外连接:是Hibernate中的概念,“迫切”表达了Hibernate急于加载Order集合数据的心情
                    会忽略batch-size属性和lazy属性
                    对HQL查询无效
5.从一个持久化对象中加载关联的单个对象
     ①双向/单向多对一情况
          Order.getCustomer();
     ②一对一情况
          Wife.getHusband();
     ③xxx-to-one元素的设置
          [1]lazy属性
               (1)proxy:默认值,表示采用延迟加载策略
               (2)false:表示采用立即加载策略
          [2]fetch属性:取值为join时以迫切左外连接的形式加载关联的Customer对象
④1的一端设置batch-size属性后,可以指定内存中有多个Customer对象时,一次性初始化的个数

struts2简单总结

struts2简单总结

=====================自定义拦截器=====================

1.实现步骤
①创建自定义拦截器实现类
[1]实现Interceptor接口或继承AbstractInterceptor类
[2]获取资源
(1)获取ActionContext对象
ActionContext context1 = ActionContext.getContext();
ActionContext context2 = invocation.getInvocationContext();
(2)获取目标Action对象
Object action = invocation.getAction();
[3]执行下一个拦截器
return invocation.invoke()
[4]返回指定的字符串,以执行指定的result
例如:return “input”;
[5]提供可以设置的参数
(1)在拦截器类内部提供setXxx()方法
private String example;

public void setExample(String example) {
this.example = example;
}

(2)在配置文件中设置参数
<!– 给自定义拦截器设置参数 –>
<interceptor-ref name=”myInter”>
<!– 参数名是拦截器类中使用setXxx()方法定义的属性 –>
<param name=”example”>Jerry</param>
</interceptor-ref>

②注册
(1)action级别:仅在这个Action中生效,与package级同时存在时优先执行Action级
<action name=”testInterceptor” class=”com.atguigu.myinter.action.TestAction”>

<!– 在action中使用自定义拦截器 –>
<interceptor-ref name=”myInter” />

<!– 必须同时引用默认拦截器栈,否则不会执行 –>
<interceptor-ref name=”defaultStack” />

<result> /success.jsp</result>

<result name=”input”>/testInterceptor.jsp </result>
</action>

(2)package级别:
<interceptors>
<!– 注册自定义拦截器本身 –>
<interceptor name=”myInter”
class=”com.atguigu.myinter.inter.MyInterception” />

<!– 创建自定义拦截器栈 –>
<interceptor-stack name=”myStack”>

<!– 给自定义拦截器设置参数 –>
<interceptor-ref name=”myInter”>
<!– 参数名是拦截器类中使用setXxx()方法定义的属性 –>
<param name=”example”>Jerry</param>
</interceptor-ref>

<interceptor-ref name=”defaultStack” />

</interceptor-stack>
</interceptors>

<!– 指定当前使用的默认拦截器栈 –>
<default-interceptor-ref name=”myStack” />
————————————————————————————————————————

====================防止表单重复提交===============

在Struts2中防止表单重复提交
①在页面上使用s:token
<!–
使用s:token标签生成token值,
一方面保存到表单的隐藏域中,
另一方面保存到Session域中
–>
②在服务器端使用token或tokenSession拦截器

使用token拦截器
<action
name=”tokenAction”
class=”com.atguigu.token.action.TokenAction”>
<!– 引用token拦截器 –>
<interceptor-ref name= “token”/>
<!– 引用原有的应该执行的拦截器栈 –>
<interceptor-ref name= “defaultStack”/>
<result>/success.jsp</result >
<!– 当使用token拦截器时,检测到表单的重复提交会使用这个Result –>
<result name=”invalid.token” >/form.jsp </result>
</action>
token拦截器错误提示:
将struts.messages.invalid.token键对应的值进行国际化即可定制

使用tokenSession拦截器
<action
name=”tokenSessionAction”
class=”com.atguigu.token.action.TokenAction” >
<!– 引用token拦截器 –>
<interceptor-ref name= “tokenSession”/>
<!– 引用原有的应该执行的拦截器栈 –>
<interceptor-ref name= “defaultStack”/>
<result> /success.jsp</result >
</action>

说明:使用tokenSession拦截器即使发生了表单重复提交也不会给出任何提示,用户看起来就好像什么都没发生一样,还是会前往目标页面。
————————————————————————————————————————

=====================文件上传下载==================

fileUpload拦截器注入文件上传的数据:
fieldName代表字段名
[fieldName] : File               文件的File对象
[fieldName]ContentType : String     文件的类型[image/jpeg…]
[fieldName]FileName : String          文件的文件名
①单个文件上传项:
private File logo;
private String logoContentType;
private String logoFileName;
②多个文件上传项:
表单中s:file的name属性要相同,例如:myFile
private List<File> myFile;
private List<String> myFileContentType;
private List<String> myFileFileName;

________________________________________________________________________________
===================文件上传限制=================

表单[enctype=”multipart/form-data”]总数据最大值:
struts.multipart.maxSize=2097152【默认2M】
<constant name=”struts.multipart.maxSize” value=”1048576″ />
限制单个文件大小、文件类型或扩展名:
【更改拦截器属性】
<interceptors>
<interceptor-stack name=”myStack”>
<interceptor-ref name=”defaultStack”>
<!– 修改拦截器属性:拦截器名.属性名 –>
<!–
setMaximumSize():设置单个文件大小的最大值(字节)
setAllowedTypes():设置支持的文件类型(有此项则不检查后缀格式)
setAllowedExtensions():设置支持的文件后缀格式
–>
<param name=”fileUpload.maximumSize”>102400</param>
<param name=”fileUpload.allowedTypes”>image/jpeg,image/gif</param>
<param name=”fileUpload.allowedExtensions”>jpg,gif</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>

<!– 对自定义拦截器栈进行引用 –>
<default-interceptor-ref name=”myStack” />

________________________________________________________________________________
=======================定制错误消息===================

关于错误消息
[1]Struts2内部定义错误消息的位置:org.apache.struts2包下面的一组国际化资源文件中
[2]我们可以在自己的国际化资源文件中定制错误消息
键的含义:
struts.messages.error.file.too.large=单个文件超限
struts.messages.error.content.type.not.allowed=内容类型不正确
struts.messages.error.file.extension.not.allowed=扩展名不对
struts.messages.upload.error.SizeLimitExceededException=总文件大小超限
占位符的含义:
①总文件大小超限:
0表示程序中设置的总大小,
1表示实际的大小
②单个文件超限:
0表示文件上传框的name属性值,
1表示文件名,
2表示缓存临时文件名,
3表示实际的文件大小
③内容类型或扩展名不正确:
0表示文件上传框的name属性值,
1表示文件名,
2表示缓存临时文件名,
3表示的内容类型
bufferSize
________________________________________________________________________________
=====================文件下载===================
<!– 使用stream结果类型返回下载的响应数据 –>
<result name=”success” type=”stream”>
<param name=”contentType”>text/xml</ param>
<!– 在Action类中使用getInputStream()方法返回的InputStream类型的属性名 –>
<param name=”inputName”>inputStream </param>
<!– 设置响应消息头,告诉浏览器下载的文件名 –>
<!–
可以在目标Action中设置getContentDisposition()方法
返回attachment;filename=”web.xml”字符串
–>
<!–
<param name=”contentDisposition”>attachment;filename=”web.xml”</param>
–>
<!– 缓存(每次读多少字节的数据,默认1024) –>
<param name=”bufferSize”>1024</param>
</result>
————————————————————————————————————————

========================输入验证==============

【声明式验证】
声明式验证的XML文件
①命名规范:Action类的简单类名-validation.xml
②保存位置:和Action类保存到同一个package下
③关联DTD约束文档:struts-2.3.15.3\src\xwork-core\src\main\resources\xwork-validator-1.0.2.dtd
④提示:可以直接将struts-2.3.15.3\apps\struts2-blank\WEB-INF\classes\example\Login-validation.xml
⑤配置方式
<!– 声明当前Action类中要验证的目标字段 –>
<field name=”age”>
<!– 为当前字段指定验证规则,这里 int规则可以将目标字段的值限定在某个范围内 –>
<field-validator type= “int”>
<!– min 参数用于限定目标字段允许的最小值 –>
<param name= “min”>20</param >
<!– max参数用于限定目标字段允许的最大值 –>
<param name= “max”>50</param >
<!– 在验证失败后显示的错误消息 –>
<!– 使用${OGNL}表达式的形式从值栈中读取数据 –>
<!– 指定一个固定的验证消息 –>
<!–
<message>Age needs to be between ${min} and ${max}</message>
–>
<!– 指定验证消息从国际化资源文件中读取,使用key属性指定键 –>
<message key=”age.message” />
</field-validator>
</field >

________________________________________________________________________________
==================自定义验证器=======================

src类路径下创建validators.xml配置文件:
<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE validators PUBLIC
“-//Apache Struts//XWork Validator Definition 1.0//EN”
“http://struts.apache.org/dtds/xwork-validator-definition-1.0.dtd”>

<validators>
<validator name=”idcard” class=”com.atguigu.validat.validator.IDCardValidator”/>
</validators>

________________________________________________________________________________
=======================特定方法验证====================

①命名规范:Action类的简单类名-方法名-validation.xml
②保存位置:和Action类保存到同一个package下
————————————————————————————————————————

===========================国际化======================

<!– 通过常量的方式指定国际化资源文件的基名 –>
<constant name=”struts.custom.i18n.resources” value=”i18n” />
src目录下(类目录)创建资源文件:
i18n_en_US.properties
i18n.properties

页面上可获取资源文件内容的方法:
<s:textfield name=”userName” key=”userName” />
<s:property value=”[0].getText(‘userName’)”/>
<s:text name=”userName” />

通过拦截器快速切换语言的方法:
<!–
Struts2拦截器只识别请求参数的键为
request_locale或request_only_locale传递语言国家码
前者保存到session域中,后者仅保存在请求域中
–>
<s:a value=”/toggleLanguage?request_locale=en_US”>English</s:a> |
<s:a value=”/toggleLanguage?request_locale=zh_CN”>中文</s:a><br />
<s:a value=”/index.jsp”>回首页</s:a>
————————————————————————————————————————
===================类型转换=========================

类型转换错误的提示消息是可以定制的。
(1)在当前Action类所在的包下创建一个.properties属性文件,文件名要和当前Action类的简单类名一致,
例如:ConversionAction.properties
(2)在属性文件——也可以称为资源文件——中,编辑如下格式的键值对
invalid.fieldvalue.目标字段名=定制的错误提示消息
例如:
invalid.fieldvalue.age=输入的不是数字

________________________________________________________________________________
=======================复杂对象====================

//简单对象
//private int age;
//private String userName;

//复杂对象
private Address address;

/**<pre>
* 保存复杂对象时,如果没有get方法,或者是get返回值为null,
*      则会通过反射创建形参对应类型的对象,并调用对应的方法注入数据。
* 例如:
*      语法: address.city
*      【对应的set方法必须只有一个形参,get方法必须无参,否则找不到方法】
*      会通过getAddress()方法获得对象
*      【此方法的返回值类型决定了setAddress()时传入的参数类型】
*      如果没有获取到对象,则在setAddress()方法时通过反射创建对象,
*      【如果没有getAddress()方法,则会创建setAddress()形参类型的对象】
*      再调用address对象的setCity()方法注入数据。
*      获取到对象的话,则直接调用获取到的Address对象的setCity()方法注入数据
* </pre>
*/
________________________________________________________________________________
===================自定义类型转换器=======================

①基于字段的配置
[1]文件命名规则
包含需要转换类型的字段的类的简单类名-conversion.properties
例如:
ConversionAction-conversion.properties
补充说明:这里“包含需要转换类型的字段的类”有两种情况:一种情况是Action类,另一种情况是使用了模型驱动后对应的JavaBean
[2]文件创建位置
包含需要转换类型的字段的类所在的package
[3]文件内容
字段名=转换器类全类名
例如:
myDate=com.atguigu.conversion.converter.MyDateConverter

②基于类型的配置
[1]文件命名规则
xwork-conversion.properties
[2]文件存放位置
当前Web工程的src目录下
[3]文件内容
待转换的类型=类型转换器的全类名
例如:
java.util.Date=com.atguigu.conversion.converter.MyDateConverter
————————————————————————————————————————

====================主题======================

【simple、xhtml(默认)、css_xhtml、ajax】
simple主题下会有label等属性会失效

<!– 全局级别 –>
<constant name=”struts.ui.theme” value=”simple” />
<!– 域对象级别 –>
request.setAttribute(“theme”, “simple”);
<!– 表单级别 –>
<s:form action=”abc” theme=”simple”>/s:form>
<!– UI标签级别 –>
<s:textfield label=”userName” name=”userName” theme=”simple” />
————————————————————————————————————————

===================声明式异常处理=====================

<!–
声明式异常处理:不是通过写代码的编程式异常处理,而是通过配置文件来处理,
捕获到对应异常后,会封装为com.opensymphony.xwork2.interceptor.ExceptionHolder对象,
压入栈顶

分为两种级别:
Action级:只在当前action标签内处理异常
全局级:在全局处理异常
当两种处理级别同时存在时,按就近原则,优先执行Action级
–>
________________________________________________________________________________
<action
name=”daoDanAction”
class=”com.atguigu.exception.action.ExceptionAction”
method=”daoDanAction”>
<!–
Action级别的声明式异常,
exception属性为需要捕获的异常类全类名,
result属性为捕获到对应异常后对应的result标签
–>
<exception-mapping result=”showError” exception=”java.lang.ArithmeticException” />
<result>/good.jsp</result>
<result name=”showError”>/makeException.jsp</result>
</action>
________________________________________________________________________________
<!–
全局result标签:
global-results标签必须首先配置,之后才能使用全局result标签
–>
<global-results>
<result name=”showGlobalError”>/globalMsg.jsp</result>
</global-results>

<!–
全局异常处理:
exception属性为需要捕获的异常类全类名,
result属性为捕获到对应异常后对应的result标签
–>
<global-exception-mappings>
<exception-mapping result=”showGlobalError”
exception=”java.lang.ArithmeticException” />
</global-exception-mappings>
————————————————————————————————————————

====================模型驱动=======================
更改默认拦截器栈
<default-interceptor-ref name=”paramsPrepareParamsStack”/>
拦截器执行顺序
*  …
*  params
*  …
*  prepare
*  …
*  modelDriven
*  …
*  params
*  …

modelDriven接口(modelDriven),Preparable接口(prepare)
————————————————————————————————————————
====================修改拦截器属性=================

取消prepare拦截器每次都执行prepare()方法:
<!– 定义自己的拦截器 –>
<interceptors>
<!– 自定义拦截器栈的声明 –>
<interceptor-stack name=”myStack”>
<!– 自定义拦截器栈引用的其它拦截器栈 –>
<interceptor-ref name=”paramsPrepareParamsStack”>
<!– 修改拦截器属性:拦截器名.属性名 –>
<param name=”prepare.alwaysInvokePrepare”>false</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>

<!– 对自定义拦截器栈进行引用 –>
<default-interceptor-ref name=”myStack”/>
————————————————————————————————————————

=====================开启动态方法调用================

<constant name=”struts.enable.DynamicMethodInvocation” value=”true” />
————————————————————————————————————————

==================引入其他struts配置文件=================

<include file=”/config.xml” />
————————————————————————————————————————

web阶段复习

web阶段复习

1.技术体系

2.HTML/XML
     ①HTML是XML的一个子集。
     ②语法规范
          ●不能交叉嵌套
          ●必须正确结束<a>aa</a> <br />
          ●标签的名字不能以数字开头
          ●每个XML文档中只能有一个根标签
          ●XML要求标签和属性大小写敏感<a>aa</A>
          ●属性必须有值,属性值必须加引号
          ●注释不能嵌套<!– <!– –> –> /*  /*  */  */
          ●XML文档的声明,可以不写,但是如果写,就必须写在第一行,且前面不能有任何其他内容
          $(“<p>aa</p>”)
     ③解析
          ●DOM
               ○特点:一次性将整个文档全部加载到内存中,生成一个DOM树,然后根据树形结构定义的父子兄弟关系进行解析。支持增删改查。
               ○扩展:dom4j/Xpath
          ●SAX
               ○特点:基于事件回调的,每次读取XML文档的一部分内容,根据读到的内容的不同,触发对应的事件,进而调用事先准备好的回调函数,将读取得到的内容以参数的形式传入回调函数。
               ○扩展:PULL
3.JavaScript/jQuery
     ①文档加载:window.onload $(function(){})
     ②事件监听响应
     ③基本语法
          [1]变量
          [2]函数
          [3]对象
          [4]数组
     ④DOM
          [1]节点:HTML/XML文档的最基本的组成部分。
          [2]节点的分类:Document、Element、Attr、Text
          [3]树形结构
               ●父子关系
                    父节点:直接包含当前节点的节点
                    祖先节点:直接或间接包含当前节点的节点
                    子节点:当前节点直接包含的节点
                    后代节点:当前节点直接或间接包含的节点
               ●兄弟关系:有共同的父节点的节点
     ⑤jQuery
          [1]秘籍
               ●首先调用jQuery的核心函数,拿着返回的jQuery对象实现功能
               ●将手册放在旁边
          [2]jQuery的核心函数
               ●参数函数:在整个文档加载完成后执行函数
               ●参数选择器字符串:根据选择器查询DOM结构
               ●参数HTML字符串:根据HTML字符串生成节点对象
               ●参数DOM对象:将这个DOM对象封装为jQuery对象返回
4.Tomcat
     对于Web应用来说,真正运行的不是Web工程,而是编译的结果
5.Servlet
     ①Servlet
          [1]操作
               ●通过实现Servlet接口,手动在web.xml中注册,来创建Servlet。
               ●通过Eclipse自动生成Servlet。
               ●在Servlet中获取请求参数
               ●在Servlet中派发页面:转发/重定向
               ●使用一个Servlet应答多个请求:BaseServlet——反射
          [2]理论
               ●作用:用于处理浏览器请求,根据处理结果派发页面,在MVC体系结构中扮演控制器角色。
               ●概念:用于处理浏览器请求的服务器端组件,Servlet接口的实现类。
               ●生命周期
                    ○创建对象:第一次接收到浏览器请求时(默认情况)——单实例,多线程方式运行的。
                    ○初始化:创建对象之后立即执行——init()
                    ○处理请求:每一次接收到浏览器请求时调用service()
                    ○清理:在Servlet对象释放之前,执行destroy()
               ●配置相关
                    ○ServletConfig
                         ◇代表:Servlet的配置信息
                         ◇对象获取:Servlet容器创建对象,然后通过init(ServletConfig config)方法以参数形式传入
                         ◇功能:
                              获取Servlet的友好名称
                              获取Servlet的初始化参数
                              获取ServletContext对象
                    ○ServletContext
                         ◇代表:Servlet的上下文信息,代表当前Web应用
                         ◇对象获取:Servlet容器创建对象,通过ServletConfig对象获取
                         ◇功能:
                              根据某个Web资源的虚拟路径获取真实物理地址:getRealPath()
                              获取Web应用的初始化参数
                              作为域对象,在整个Web应用范围内共享数据
     ②HTTP
          [1]作用:定义了浏览器和服务器之间交互过程中的数据格式
          [2]请求数据格式
               请求行
               请求消息头
               请求体
          [3]响应数据格式
               响应状态行
               响应消息头
               响应体
          [4]GET和POST区别
GET POST
请求参数的位置 URL地址后面,请求行 请求体
浏览器地址栏 可见 不可见
传输数据的容量 有限制 没有限制
编码能力 URL地址的方式,仅限于ASCII码 URL/二进制
产生方式 超链接、浏览器地址栏直接输入、form method=”get”、img src……等等。 form metho=”POST”
Ajax
          [5]响应状态码
               200:正常执行
               302:重定向
               404:资源找不到
               500:服务器内部错误
          [6]404错误产生的原因
               ○真的找不到资源,路径问题
               ○访问了WEB-INF目录下的资源
               ○web.xml等配置文件发生错误,在Web应用启动时就抛出了异常
               ○服务器端缓存问题
     ③请求和响应
          [1]HttpServletRequest
               ○代表:HTTP请求
               ○对象获取:Servlet容器创建,通过service()方法传入
               ○功能:
                    ◇获取请求参数
                    ◇在属性域中保存数据,在同一个请求范围内共享
                    ◇转发请求
                    ◇获取请求消息头中的信息

[2]HttpServletResponse

               ○代表:HTTP响应
               ○对象获取:Servlet容器创建,通过service()方法传入
               ○功能:
                    ◇获取能够将数据返回给浏览器的输出流:字符流,字节流
                    ◇设置响应消息头
                    ◇重定向请求
          [3]转发和重定向的区别
转发 重定向
请求次数 一次 两次
产生的位置 服务器内部 服务器通知浏览器访问一个新的地址
共享请求域中的数据 可以 不可以
WEB-INF目录下的资源 可以访问 不可以
     ④字符乱码问题
          [1]理论依据:编码和解码过程中使用相同的字符集
               编码:’中’→1010110
               解码:1010110→’中’
          [2]请求
               GET请求:在Tomcat解压目录下conf/server.xml配置文件中的connector标签内添加URIEncoding=”UTF-8″
               POST请求:每一个需要处理的POST请求中,使用request.setCharacterEncoding(“UTF-8”);
                    注意:一定要在request.getParameter()方法执行之前设置。
          [3]响应
               指定响应数据的编码字符集
               告诉浏览器使用什么字符集进行解码
               由于Servlet容器非常智能,会自动根据解码字符集确定编码字符集,所以只需指定响应数据的解码字符集即可,指定的方式是修改内容类型响应消息头。
               response.setContentType(“text/html;charset=UTF-8”);
     ⑤路径问题
          [1]相对路径有可能有问题,但绝对路径肯定没问题。
          [2]绝对路径:路径以“/”开头。
          [3]分类:
               (1)浏览器解析:开头的“/”代表当前主机地址,需要附加Web应用的虚拟路径才能够定位到一个具体的Web应用。
               (2)服务器解析:开头的“/”代表当前Web应用。
          [4]归属
               (1)浏览器解析:HTML页面上路径,重定向
               (2)服务器解析:转发,web.xml中的配置信息中的路径
6.JSP
     ①作用:动态显示浏览器界面,JSP=HTML+Servlet
     ②原理
          [1]工作机制:xxx.jsp→翻译→xxx_jsp.java→编译→xxx_jsp.class→执行结果→作为响应数据返回给浏览器
          [2]本质:Servlet。
     ③JSP基本语法
          [1]JSP脚本片段:<%  %> _jspService()
          [2]JSP表达式:<%= %> out.print(Object obj);
          [3]JSP指令
               page
               include
               taglib
          [4]JSP标签
               jsp:forward
               jsp:param
               jsp:include
          [5]JSP隐含对象
               (1)隐含:直接能用
               (2)为什么直接可以使用?九大隐含对象和JSP脚本片段、JSP表达式属于同一个变量作用域。
               (3)九大隐含对象:pageContext、request、session、application、response、config、exception、out、page
               (4)域对象
                    pageContext:当前页面范围
                    request:当前请求
                    session:当前会话
                    application:当前Web应用
               (5)pageContext:JSP页面的上下文对象,可以获取其他八个隐含对象
7.EL
     ①作用:读取请求参数、域对象数据、隐含对象中封装的数据
          ${pageContext.request.contextPath }
     ②隐含对象
          pageContext:获取其他八个JSP隐含对象
          xxxScope Map<String,Object> :封装了域对象中属性名/属性值数据的Map
          param Map<String,String>:封装了请求参数数据,但只能通过请求参数的名字获取第一个值
          paramValues Map<String,String[]>:封装了请求参数数据,可以通过请求参数的名字,获取一组值
     ③语法
          [1]读取一般对象:${object.property }这里,property是使用getProperty()方法定义的。
          [2]读取Map对象:${map.key }这里,key是Map对象中的键
8.JSTL
     ①原理:标签前缀→prefix→uri→xxx.tld→标签处理器类的注册信息→标签处理器类
     ②常用标签
          c:if一重判断
          c:choose/c:when/c:otherwise多重判断
          c:forEach变量集合
9.会话控制
     ①背景:HTTP协议是一个无状态的协议,上一次请求和这一次请求的两次连接之间没有任何关系。
     ②Cookie
          [1]浏览器端缓存数据的技术
          [2]Cookie的工作机制
               (1)创建Cookie对象:new Cookie(String name,String value);
               (2)回送Cookie:
                    response.addCookie(cookie);
                    Set-cookie:name=xxx,value=xxx
               (3)携带Cookie:Cookie:name=xxx,value=xxx
               (4)读取Cookie的信息:request.getCookies();返回Cookie的数组
          [3]Cookie时效
               (1)分类:会话级[浏览器内存中]/持久化[浏览器本地的文件系统中]
               (2)cookie.setMaxAge(int age);
                    age>0:设置Cookie为持久化Cookie,在age秒内有效
                    age=0:告诉浏览器删除Cookie
                    age<0:将Cookie设置为会话级的Cookie
     ③Session
          [1]Session工作机制
               request.getSession()方法
               (1)请求中没有携带JSESSIONID的Cookie,创建一个新的Session对象,并返回一个JSESSIONID的Cookie
               (2)请求中携带了JSESSIONID的Cookie,根据这个JSESSIONID查找对应的Session对象
                    <1>能找到:直接返回
                    <2>找不到:创建一个新的Session对象,并返回一个JSESSIONID的Cookie
          [2]Session时效
               (1)Session时效指的是最长的空闲时间,默认30分钟
               (2)设置有效时间
                    session.setMaxInactiveInterval(int second);
               (3)将Session对象强制失效
                    session.invalidate()
10.Filter
     ①作用:在请求到达目标资源之前,进行拦截,然后根据一定的条件进行统一的过滤操作。
     ②生命周期:Web应用加载时创建对象。
     ③在web.xml中配置要拦截的目标资源
          URL地址
               精确匹配
               模糊匹配:前缀/后缀
          Servlet名字
     ④Filter链:多个Filter拦截同一个资源,形成Filter链,多个Filter链根据filter-mapping配置的顺序决定调用的顺序。
11.Listener
     作用:监控Web应用中组件的生命周期和属性域变化。
12.国际化
     Locale:代表本地信息
     国际化资源文件:用于保存不同版本的语言数据
13.文件上传下载
     ①上传
          [1]对表单的要求
               method=”post”
               enctype=”multipart/form-data”
               input type=”file”
          [2]使用FileUpload组件
     ②下载
          [1]不建议将文件直接暴露给用户,不安全,浏览器能识别的格式会显示而不是下载
          [2]将要下载的文件保存到WEB-INF目录保护起来
               使用Servlet将文件以输入流的形式读取到内存中
               通过response对象获取字节输出流,返回浏览器
               需要设置相应的响应消息头
14.Ajax
     JSON格式
          ①最外层:{}或[]
          ②如果最外层是{}:JSON对象
               {key:value,key:value,…,key:value}
          ③如果最外层是[]:JSON数组
               [value,value,..,value]
          ④key:只能是字符串
          ⑤value:
               基本数据类型
               引用数据类型:数组或对象
     JSON VS XML
          ①JSON更轻巧,数据量更小
          ②是JavaScript原生的数据格式,解析方便
          ③传输快,解析快
          ④JSON可读性较差,所以不适合作为配置文件

算法排序

算法排序

衡量排序算法的优劣:
1.时间复杂度:分析关键字的比较次数和记录的移动次数
2.空间复杂度:分析排序算法中需要多少辅助内存
3.稳定性:若两个记录A和B的关键字值相等,但排序后A、B的先后次序保持不变,则称这种排序算法是稳定的。
内部排序:整个排序过程不需要借助于外部存储器(如磁盘等),所有排序操作都在内存中完成。
外部排序:参与排序的数据非常多,数据量非常大,计算机无法把整个排序过程放在内存中完成,必须借助于外部存储器(如磁盘)。外部排序最常见的是多路归并排序。可以认为外部排序是由多次内部排序组成。
常用的内部排序
选择排序
直接选择排序、堆排序
交换排序
冒泡排序、快速排序
插入排序
直接插入排序、折半插入排序、Shell排序
归并排序
桶式排序
基数排序
Image
1.从平均时间而言:快速排序最佳。但在最坏情况下时间性能不如堆排序和归并排序。
2.从算法简单性看:由于直接选择排序、直接插入排序和冒泡排序的算法比较简单,将其认为是简单算法,都包含在上图的“简单排序”中。对于Shell排序、堆排序、快速排序和归并排序算法,其算法比较复杂,认为是复杂排序。
3.从稳定性看:直接插入排序、冒泡排序和归并排序时稳定的;而直接选择排序、快速排序、 Shell排序和堆排序是不稳定排序
4.从待排序的记录数n的大小看,n较小时,宜采用简单排序;而n较大时宜采用改进排序。
(1)若n较小(如n≤50),可采用直接插入或直接选择排序。
     当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插入,应选直接选择排序为宜。
(2)若文件初始状态基本有序(指正序),则应选用直接插入、冒泡或随机的快速排序为宜;
(3)若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或归并排序。