1、首先关于Struts2框架:java
①特色:web
一、通用性app
二、可扩展性框架
struts2能够自定义类型转换器(尚待深刻)、自定义拦截器。jsp
三、非侵入式ui
不会污染其余模块spa
②配置code
一、Web工程的web.xml文件配置filter拦截器(拦截*.action请求)xml
二、struts.xml首先要关联约束文档对象
<package name="default" namespace="/" extends="strutd-default"> <action name="saveBook" class="com.atguigu.bean.Book" method="save"> <result name="toDetailPage">detailpage.jsp</result> </action> </package>
标签package的做用是定义一个功能模块,其name属性做为标识是必填项,便于其余package引用,extends是继承了默认的配置。namespace也采用了默认配置,若是采用自定义名称空间,则访问这个package中定义的action时,必须在路径中加上名称空间值。
action对应着请求,class属性指定处理请求的类,method属性为处理请求的具体方法,result则对应响应,注意其name属性值。
③Action类
类中的set方法是注入请求参数,get方法做用是在jsp文件中利用EL表达式取出数据显示出来。固然,在标签action中指定了method的属性值为save,这个save就是Action类中处理请求的具体方法,此方法有固定的格式:
1)public 权限
2)String返回值类型
3) 没有参数
2、值栈
Struts2中的request对象不是Servlet容器建立的request对象了。
public class StrutsRequestWrapper extends HttpServletRequestWrapper{ public Object getAttribute(String key){ if(key==null){ throw new NullPointerException("You must specify a key value"); } if(){ return super.getAttribute(key); } ActionContext ctx=ActionContext.getContext(); Object attribute=super.getAttribute(key); if(ctx!=null&&attribute==null){ boolean alreadyIn=isTrue((Boolean)ctx.get(REQUEST_WRAPPER_GET_ATTRIBUTE)); if(!alreadyIn&&!key.contains("#")){ try{ ctx.put(REQUEST_WRAPPER_GET_ATTRIBUTE, Boolean.TRUE); ValueStack stack=ctx.getValueStack(); if(stack!=null){ attribute=stack.findValue(key); }catch(Exception e){ ... }finally{ ctx.put(REQUEST_WRAPPER_GET_ATTRIBUTE, Boolean.FALSE); } } } } return attribute; } }
它修改了getAttribute()方法,但除了request以外,获取的response和ServletContext对象依然是原生的,太晚了,明天继续,但愿本身能坚持下来