使用:URL重写机制来解决,url+sessionID 即在访问某个需要session机制支持的组件时,不需要在浏览器地址栏输入地址,而是通过服务器生成的URL地址来访问。
response.encodeURL(url)//在链接,表单提交时使用。 response.encodeRedirectURL(url)//在重定向时,使用
session优点:
相对于cookie机制,安全,存放的数据可以是对象,存放的数据量也更大。 缺点:
所有的数据都存在服务器端,服务器端压力比较大,一般会采取激活,钝化机制,将session当中的数据临时保存到文件或者数据库。
Servlet线程安全问题:在默认情况下,容器只会为某个servlet维护一个实例,当多个请求到达容器时,有可能多个线程会访问同一个实例。 如何解决:
1.加锁。比如可以使用synchronized对方法或者代码块加锁。
2.实现SingleThreadModel接口(servlet容器会为每一个请求创建一个与之对应的
实例,不建议使用,因为这样会创建大量的servlet对象)
3.避免使用全局变量(实例变量),使用局部变量。
4.尽量不对属性值进行修改(即:尽量不要对全局变量值,进行修改。)
Ajax:通过浏览器内置的XMLRequest异步的向服务器发送请求,服务器在处理完请求后,返回数据给XMLRequest,通过JavaScript可以获取XMLHttpRequest中的数据,然后使用该数据更新页面。
编程:
1.获取XMLHttpRequest对象 2.使用XMLHttpRequest对象 1)url
2)XMLHttpRequest.open(‘get/post’,url,true) 3)XMLHttpRequest.onReadyStateChange = fun1;
//注册回调函数,用于处理服务器请求。
4)XMLHttpRequest.Send()
3.在服务器端编写相应代码处理请求。再服务器端,一般不会返回完整的页面,只需要返回部分数据。
4.在回调函数中,通过XMLHttpRequest获取数据,然后更新页面。
El&&jstl自定义
EL即Expression Language(表达式语言) EL的语法:${ EL exprission }
${ bean.name } 或 ${ bean['name'] }
JSTL( JSP Standard Tag Library)是JSP标准标签库
自定义el函数:
1.写一个java类,定义一个或者多个public static 方法,在方法中实现函数逻辑。 2.在.tld文件中描述该函数。(在jstl库中,找到fn.tld参考其格式) 3.在jsp页面中,使用taglib指令导入相应的函数。
自定义标签:
<%@ taglib uri=\
1.写一个java类,实现SimpleTag接口,或者继承SimpleTagSupport。
2.在java类中,重写doTag()方法,在该方法当中,实现标签的业务逻辑。 3.在.tld文件当中,描述标签
4.在jsp页面中,使用taglib指令导入相应的标签。
OGNL(Object-Graph Navigation Language),大概可以理解为:对象图形化导航语言。是一种可以方便地操作对象属性的开源表达式语言。
过滤器:在servlet规范中定义的一种特殊的类,可以用来拦截服务器调用servlet的过程。 编程: 1.写一个类,实现implements Filter接口 2.在doFilter()方法里,实现过滤的逻辑。 3.在web.xml中配置过滤器
过滤器的优先级:按配置的先后顺序执行
SSH内容:
Struts2负责显示层和控制层,Spring负责业务层,hibernate负责持久化层。
Struts2:工作流程
浏览器 1请求过滤器 2调用 action 3调用业务类 action 4转发jsp 5应答浏览器
1. Action中获取jsp的值:
1、 页面中name的属性和action中的属性必须保持一致。 2、 Action中的属性必须有get和set方法。 3、 满足这两个条件就实现了属性驱动。 实现原理:
struts2会拦截器
public class ActionMappingParametersInteceptor extends ParametersInterceptor 根据反射的机制,调用对应action的对应set方法,获取页面表单的值。
模型驱动:
publicclassModelActionextendsActionSupportimplementsModelDriven
private User user = new User(); @Override
public User getModel() { returnuser; }
过程为:当浏览器提交ModelAction.action请求时,先经过拦截器。其中有一个拦截器为ModelDrivenInterceptor,从这个源代码可以看出,这个拦截器的作用就是获取实现了ModelDriver接口的action的模型驱动。在这里为user。然后把模型驱动利用push方法压入到栈顶。这样我们就能直接通过属性进行回显和赋值了。
通过这个图也可以看出模型驱动的拦截器在参数拦截器前面,也就是先把模型驱动压入栈顶,再进行赋值。
模型驱动过程:当用户触发UserAction动作时,ModelDriven拦截器会调用相关UserAction对象的getModel()方法,并将返回值(User实例)压入到valueStack栈中,接下来parameters拦截器将把表单中的字段映射到valueStack栈顶对应的各个属性当中。因为此时栈顶是刚刚被压入的模型,所以模型被填充。
不能转换的怎么办:比如struts2 要求的日期是:yyyy-mm-dd
但如果是yyyyMMdd怎么办?
1、 写一个java类,这个类必须继承DefaultTypeConverter或者实现
TypeConverter接口。 2、 配置自定义的类型转换器:
1.基于字段(局部的)
创建一个属性文件actionName(根据action类名来写)-conversion.properties,该文件需要与相对应的动作类放在同一目录下。 Egg:UserAction--conversion.properties中 createTime = com.lyg.converter.DateConverter 2.基于类(全局的)
在根目录下:创建xwork-conversion.properties Java.util.Date = com.lyg.converter.DateConverter
2.国际化
1.定义不同的资源文件 resources_en_US.properties resources_zh_CN.properties resources.properties(默认)
2.在struts.xml 中配置
2.自定义拦截器:拦截器是AOP的一种实现
所有的拦截器都实现了Interceptor接口,或者继承了Interceptor接口扩展类实现类。 重写init(),intercept(),destroy()方法
intercept()每次请求就执行一次,做相关的处理工作
在struts.xml 中配置,注册即:把默认栈加入到自己写的拦截器中
使用自己写的拦截器栈:
说明:使用拦截器栈。从上面声明部分可以看出,accessInterceptorStack栈既包括了自定义的拦截器,又包括了struts2内部的拦截器栈。 拦截器与过滤器的区别; 1)拦截器是基于Java反射机制的,而过滤器是基于接口回调的。s 2)过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容器。 3)拦截器只能对Action请求起作用,而过滤器可以对所有请求起作用。 4)拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。 3.文件上传 4.struts2 手工验证&&xml验证 Get/set获取数据验证: public void validate() {}这是一个默认的实现,子类应该覆盖整个方法去完成验证逻辑,执行后filedError为空,将执行action中的处理方法。 针对所有业务方法:validate() 针对某一个业务方法:validateLogin() 4.ognl对象导航语言 struts2默认表达是语言 #访问OGNL上下文和action上下文 #request.username等价于request.getAttribute(“username”) 访问根元素则不需要 %{} 告诉环境{}里面的是ognl表达式。 $: 用于在国际化资源文件中,引用OGNL 用于在struts.xml配置文件中,引用OGNL表达式。比如:abc.jsp?username=${username} 5.回显 回显是用栈顶元素值回显。 方法一:要么修改压入到栈顶元素的属性值。 方法二:要么删除栈顶元素,压入新构建的对象。 注意:不能使用赋值因为赋值改变的是引用,不会改变值栈的值。 6.处理表单重复提交 1.在表单中增加隐藏域: 2.在默认拦截器栈中加入,令牌拦截器并配置针对的方法。(修改默认拦截器) 3.在struts.xml 中增加一个返回结果类型result 7.valueStack值栈