Struts2复习笔记

1.namespace如果为空,表明可以接受任意路径的Action。如http://****/webapp/***.action还是http://***/webapp/**/**/***.action。
2.result中name不写,表明result为success。
3.Struts2每次接收请求时,都new一个新Action对象。这是Struts2与Struts1非常重要的区别,Struts1只有一个Action提供服务,这就需要用户很好的进行线程同步。
4.Struts2中的路径是根据action的路径而来的,而不是根据JSP的路径。所以解决方案有两种:
   *使用绝对路径  *加上basePath
    还有就是设置<base href="<%=basePath%>"/>使得页面的路径前面都会加上basePath
    使用MyEclipse 7.0,其生成的JSP文件自动加上了<base href="<%=basePath>"/>,所以路径问题基本不用自己操心。
5.<action name="" class="" method=""/>一旦在method中进行了指定,如指定method="add"那么调用的就是Action中的add方法。(默认是execute方法)。
user!add  动态方法调用DMI,即调用user action下面的add方法。
6.<action name="student*" class="" method="{1}">
   <result>student{1}_success.jsp</result>
   <action>
    即使用通配符,*是对字符串的匹配,而{1}则是对匹配的字符串排了顺序以后,第一个字符串。使用通配符,可以使得配置量降到最低。
真正做项目开发,记住一句话:约定优于配置。这就是从通配符中体会到的。
如果用了通配符,且有几个Action根据通配符都能够匹配上URL,那么优先匹配最精确的那一个。带有通配符的精确度一样,那么谁在前面调用谁。
7.最常用的接受参数的方法,使用Domain Model的方式进行接受。
8.一种数据校验的方式:
首先,在Action中写上this.addFieldError("name","用户名输入有误")
然后,在error跳转的页面中加上<s:fielderror fieldName="name"  theme="simple"/>
那么在此页面中,即可以非常方便的看到错误提示。
9.<s:debug></s:debug>调试的时候非常有用
10.s:property专门取value stack和context中的属性
11.errors对应MAP,name为key,value为集合或者数组,可以使用OGNL表达式按照下标取出。
访问WEB元素的四种方法:
1.取得Map形式的request,session和application,用的方法:ActionContext.getContext().get("request"),ActionContext.getContext.getSession()以及ActionContext.getContext.getApplication()
#attr会挨排搜request,session,application,看其中有那个包含指定的key值。不常用!
2.实现RequestAware、SessionAware、ApplicationAware接口,其中setRequest、setSession和setApplication可以得到Map类型的request、session和application。
3.获得HttpRequest,HttpSession,ServletContext
HttpRequest request = ServletActionContext.getRequest()
HttpSession session = request.getSession()
ServletContext application = session.getServletContext()
(知道就可以了,基本不用)
4.依赖注入,ServletRequestAware即可以了
12.如果要将一个xml的内容包含在另一个xml中,那么只需这样写即可:
<include file="***.xml"/>这样,即完成了包含动作(Include Module)
13.默认的Action:
 <default-action-ref name="index" />
默认的action可以在用户输错URL时自动执行默认的Action,从而可以对此进行处理,如跳转到首页。
14.Result type
当不指定Result的类型时,默认为dispatcher,即服务器跳转,就是forward到一个地址上去。
服务器端的forward即:
RequestDispatcher dispatcher = request.getRequestDispatcher("a.html");
dispatcher.forward(request,response);
chain是指forward到一个action;redirectAction指的redirect到一个action;
redirect客户端跳转到一个页面。
服务器端跳转是指跳转是在服务器端完成的,客户端并不知情;而客户端跳转,则是客户端发起一个请求,redirect后,客户端再用新的URL地址重新进行请求。
如果希望跳转到其他包下的Action中,那么是这样的:
<result type="chain">
    <param name="actionName">r1</param>
    <param name="namespace">/space</param>
</result>
通过配置参数的方法,来配置跳转的位置。
15.全局结果集,如果配置了全局结果集,就只需要在action中直接使用就可以了
配置方法:
<global-results>
    <result name="mainPage">/mainPage.jsp</result>
</global-results>     global-results是配置在package中的,如果另一个package也需要用,那么就需要
extends继承
16.在action中动态的配置r,如r="/aaa.html",然后再在struts.xml中用
<result>${r}</result>即可,这就是动态结果集的使用
17.带参数的结果集,比如Action中带有参数type,那么它在跳转时希望把值传过去,那么就是这样写:
<result name="success" type="redirect">
    /kkk.jsp?t=${type}
</result>这样就可以把参数传过去了。但是并不是放在值栈中(因为没有Action),只能用取参数的方式取。
如果是forward几个Action共用值栈,那么就不需要传递了。一个request只有一个值栈。
传参数是redirect才需要!!!

读书的原则是,90%的书都应该在3天内读完,记住那些最常用的,而不常用的,则是脑子里面留印象,记不住的时候再回头查。

OGNL表达式:(Object Graph Navigation Language)
当user.***被传进去时,才会构造User,才会new一个User。
访问值栈中的普通方法<s:property value="password.length()"/>
访问静态方法:<s:property value="类名@方法名()"/>
要能够访问静态方法,还需要加上<constant name="struts.ognl.allowStaticMethodAccess" value="true" />到struts.xml中进行配置,这样才能够访问静态的方法。
访问Math的静态方法:<s:property value="@@max(2,3)"/>
访问List中的某个元素:<s:property value="user[1]"/>
访问Map中的某个元素:<s:property value="dogMap.dog101"/>
{}在OGNL中表示集合;SET是没有顺序的
投影/过滤:?#、^#、$#  ----------^表示开头,$表示结尾,?表示过滤条件

<s:property value="[0]"/>表示的是访问栈顶的元素
如果用了服务器端的Action跳转,那么就会把需要用到的Action依次压入Value Stack中

Struts中的标签,控制标签、UI标签和AJAX标签

<s:property value="admin" default="管理员"/>即从admin中取不到值,那么默认的值就是“管理员”

<s:property value="<hr/>" escape="false"/>表示将值直接以HTML的形式输出

<s:set var="adminName" value="username"/>就是指设定了一个变量,它的名称为"adminName"
默认的范围是request和ActionContext
那么从request取值<s:property value="#request.adminName"/>和从ActionContext取值<s:property value="#adminName"/>

scope="page"时取值的方法为pageContext.getAttribute("***")
set标签中有用的属性:var/value/scope
set标签在换名的时候用得特别多

<s:bean name="com.****.Dog" var="myDog">
    <s:param name="dogName" value="'oudy'"/>
</s:bean>
如果s:bean没有设var,那么出了标签就被回收了,在标签外无法访问

<s:include value="/index.html"></s:include>标签,类似于<jsp:include page=""/>标签,但是处理中文有问题,推荐不用。

%{}的意义是把其中的值不当成字符串,而当成OGNL表达式
$就用于配置文件的取值,即动态的结果集
#用于取ActionContext中的值

<s:if test="tag == false">
    <%out.println("Hello world!");%>
</s:if>
其他的:s:elseif,s:else类似。

<s:itearator value="{'a','b','c'}" var="x">
    <s:property value="#x.toUpperCase()"/>
</s:iterator>
x相当于for循环中的那个变量,即遍历中取出的那个值。

<s:iterator value="{'a','b','c'}" status="status">
    <s:property/>
    遍历过的元素总数:<s:property value="#status.count"/><br/>
    遍历过的元素索引:<s:property value="#status.index"/><br/>
    当前是偶数:<s:property value="#status.even"/><br/>
    当前是奇数:<s:property value="#status.odd"/><br/>
    是第一个元素:<s:property value="#status.first"/><br/>
    是最后一个元素:<s:property value="#status.last"/><br/>
</s:iteartor>

定义map需要:#{1:'a',2:'b',3:'c'}

<s:subset source="myList" count="13" start="3">
</s:subset>
即从myList中从第3个开始,截取13个,作为子集合。

Struts2的UI标签:
在constant中可以设置theme。

PreparedStatement的两个好处:
1.防止SQL注入
2.执行过一次之后,就放入缓存之中,如果下次再用,那么就直接从缓存中取即可。

Struts2异常处理:
在struts.xml中配置:
<exception-mapping result="error" exception="java.sql.SQLException"/>
<result name="error">/error.jsp</result>
如果想要设全局的异常映射:
<global-exception-mappings>
    <exception-mapping result="error" exception="java.sql.SQLException"/>
</global-exception-mappings>
其他的package extends这个定义了全局异常的package即可用使用
也可以配合着用global-result
<global-results>
    <result name="success">/aaa.jsp</result>
</global-results>
声明式异常处理原理----拦截器
请求--->Struts filter过滤--->****Action,在从filter到action的过程中会有拦截器,中间有拦截器的话,首先是从filter到拦截器,再从拦截器到Action,调完之后,再返回到拦截器继续执行。拦截器执行完了之后,才返回到struts的filter。

默认拦截器的配置是:defaultStack
继承AbstactInterceptor抽象类,实现Interceptor接口
是intercept()方法实现的拦截
在其中invocation.invoke()就已经调用了Action了,一般是这样:
try{

    result = invocation.invoke();
}catch(...){

    //获得exception映射
    //找到异常的结果,并且把它赋值给result,然后再返回
   //将异常放入value stack中
}

只是简单的转发,而不是要做数据库的处理的话,才会用default-action-ref。

i18N:(国际化)
ResourceBundle res = ResourceBundle.getBundle("app",Locale.US);
获得资源文件
res.getProperty("key")即可以得到对应的properties的值。
如果是Locale.US对应app_en_US.properties中的内容,Locale.CHINA对应app_zh_CN.properties中的内容。
但是properties文件不允许写中文。如果非要写,得用JDK下的native2ascii转一下。

<s:property value="getText(login.username)"/>可以取得app_en_US.properties中定义的login.username=admin。
s:property中直接调方法,只有针对于Action才能够直接调用方法。
为了配置取的property的名字,需要写上:
<constant name="struts.custom.i18n.resources" value="bbs2009"></constant>
(这里的properties的名字是bbs2009_en_US.properties)
<a href="**/**Action?request_locale=en_US">en</a>

读代码应该顺着一条线读进去。
拦截器原理分析:
Client->Struts Filter->Dispatcher->ActionProxy->ActionInvocation<->Interceptor
在ActionInvocation调用Interceptor的intercept方法进入interceptor后,interceptor又回调invocation.invoke方法,重新进入ActionInvocation,重新执行:
if(interceptories.hasNext()){

    ******
}
这时就进入下一个Interceptor,再次执行。

配置interceptor:
<interceptors>
    <interceptor name="" class=""></interceptor>
</interceptors>
再在action中配置对于interceptor的引用:
<interceptor-ref name=""></interceptor>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值