zoukankan      html  css  js  c++  java
  • 【Struts2+Spring3+Hibernate3】SSH框架整合实现CRUD_1.3

    作者: hzboy192@192.com
    Blog: http://my.csdn.net/peng_hao1988
    版本总览:http://blog.csdn.net/peng_hao1988/article/details/9026897

     

    实现步骤:

    一、OGNL(对象导航、方法调用、集合对象)
    (1)OGNL对象导航

    <!-- 访问action中的属性直接使用属性名称 -->
    <s:iterator var="user" value="users">
    	<tr align="center"  height="24px">
    		<td width="100">
    			<!-- 访问非root级属性必须使用# -->
    			<s:property value="#user.id"/>
    		</td>
    		<td width="160"><s:property value="#user.uname"/></td>
    		<td width="70"><s:property value="#user.sex"/></td>
    		<td width="150"><s:property value="#user.telphone"/></td>
    		<td width="300"><s:property value="#user.address"/></td>
    		<td width="120">
    			<a href="edit.action?param=0&id=<s:property value="#user.id"/>">
    				<s:text name="edt"/>
    			</a>  
    			<a href="delete.action?id=<s:property value="#user.id"/>"><s:text name="del"/></a>
    		</td>
    	</tr>
    </s:iterator>

    (2).方法调用,集合对象

    <body>
    	<div style="margin-left:auto 10px;">
    		<ul style="list-style:none">
    			<li><b>OGNL 方法调用测试</b></li>
    			<li>
    				调用普通类中的方法:<s:property value="#session.userinfo.getUname()"/>
    			</li>
    			<li>
    				<!-- 
    				这里因为没有通过action转向过来,所以看到效果,这里的add()方法为定向到该页面的action中的方法 ,有兴趣的
    				同学可以自己试一下。
    				-->
    				调用Action类中的方法:<s:property value="add()"/>
    			</li>
    			<li>
    				<!-- 这里成功的前提是已经配置了struts2 OGNL允许访问静态方法 -->
    				调用普通类中的静态方法:<s:property value="@com.hzboy.common.Global@showMessage()"/>
    			</li>
    			<li>
    				<!-- 属性必须为public -->
    				调用普通类中的静态属性:<s:property value="@com.hzboy.common.Global@SESSION_USER_INFO"/>
    			</li>
    			<li>
    				<!-- 属性必须为public -->
    				调用普通类中构造方法:<s:property value="new com.hzboy.orm.Userinfo()"/>
    			</li>
    			<li>
    				调用JDK类库的方法:<s:property value="@java.util.Calendar@getInstance()"/>
    			</li>
    			<li>
    				调用JDK类库的Math方法:<s:property value="@@random()"/>
    			</li>
    			
    			<li><br/><b>OGNL 访问集合类测试</b></li>
    			<li>
    				访问Userinfo List集合:<s:property value="@com.hzboy.common.Global@getUsers()"/>
    			</li>
    			<li>
    				访问Userinfo List集合中某个对象:<s:property value="@com.hzboy.common.Global@getUsers()[1]"/>
    			</li>
    			<li>
    				访问Userinfo List集合中某属性集合:<s:property value="@com.hzboy.common.Global@getUsers().{uname}"/>
    			</li>
    			<li>
    				访问Userinfo List集合中某属性集合中的某个对象:<s:property value="@com.hzboy.common.Global@getUsers().{uname}[2]"/>
    			</li>
    			
    			
    			<li>
    				访问City Set集合:<s:property value="@com.hzboy.common.Global@getCities()"/>
    			</li>
    			<li>
    				<!-- set是无须的不能通过下标访问,无法获取到值 -->
    				访问City Set集合中某个对象:<s:property value="@com.hzboy.common.Global@getCities()[1]"/>
    			</li>
    			
    			
    			<li>
    				访问City Map集合:<s:property value="@com.hzboy.common.Global@getCitiesMap()"/>
    			</li>
    			<li>
    				访问City Map集合中key集合:<s:property value="@com.hzboy.common.Global@getCitiesMap().keys"/>
    			</li>
    			<li>
    				访问City Map集合中value集合:<s:property value="@com.hzboy.common.Global@getCitiesMap().values"/>
    			</li>
    			<li>
    				<!-- []中为key值,字符串用单引号引起来 -->
    				访问City Map集合中某个key映射的对象:<s:property value="@com.hzboy.common.Global@getCitiesMap()[2]"/>
    			</li>
    			
    			
    			<li>
    				访问Userinfo List集合:<s:property value="@com.hzboy.common.Global@getUsers().size()"/>
    			</li>
    			<li>
    				访问City Set集合的大小:<s:property value="@com.hzboy.common.Global@getCities().size()"/>
    			</li>
    			<li>
    				访问City Map集合的大小:<s:property value="@com.hzboy.common.Global@getCitiesMap().size()"/>
    			</li>
    			
    			<li><br/><b>OGNL 投影和选择测试</b></li>
    			<li>
    				获得所有用户中的所有男性用户:<s:property value="@com.hzboy.common.Global@getUsers().{?#this.sex=='man'}"/>
    			</li>
    			<li>
    				获得所有用户中的所有男性用户的名字:<s:property value="@com.hzboy.common.Global@getUsers().{?#this.sex=='man'}.{uname}"/>
    			</li>
    			<li>
    				获得所有用户中的第一个男性用户[0]:<s:property value="@com.hzboy.common.Global@getUsers().{?#this.sex=='man'}[0]"/>
    			</li>
    			<li>
    				获得所有用户中的第一个男性用户[^]:<s:property value="@com.hzboy.common.Global@getUsers().{^#this.sex=='man'}"/>
    			</li>
    			<li>
    				获得所有用户中的第最后一个男性用户[$]:<s:property value="@com.hzboy.common.Global@getUsers().{$#this.sex=='man'}"/>
    			</li>
    			<li>
    				获得所有用户中的第一个男性用户的名字:<s:property value="@com.hzboy.common.Global@getUsers().{?#this.sex=='man'}[0].{uname}"/>
    			</li>
    		</ul>
    	</div>
    </body>


    二、高级action(动态action)
    (1)、配置无效action的处理方式一:

    <!-- 默认资源找不到(在地址栏随意写xxx.action访问系统),只能拦截无效action,无法处理jsp的请求,jsp需要在web.xml
    中配置error-page -->
    <default-action-ref name="notfound"/>
    
    <action name="notfound">
    	<result>/WEB-INF/jsp/404.jsp</result>
    </action>

    (2)、配置无效action的处理方式二:

    <package name="error" extends="default">
    	<!-- 捕获无法匹配的action,*可以匹配当前路径下所有没有找到的action,××可以匹配当前及下级没有找到的action -->
    	<action name="**">
    		<result>/WEB-INF/jsp/404.jsp</result>
    	</action>
    </package>

    (3)、只配置action类,不映射到method,然后通过指明方法名称来调用类中的方法处理请求:

    <!-- 
    <action name="query" class="userAct" method="doQuery">
    	<result name="query">/WEB-INF/jsp/success.jsp</result>
    </action>
    
    <action name="edit" class="userAct" method="doEdit">
    	<result name="editUser">/WEB-INF/jsp/editUser.jsp</result>
    </action>
    
    <action name="add" class="userAct" method="doAdd">
    	<result name="addUser">/WEB-INF/jsp/addUser.jsp</result>
    </action>
     -->
    <!-- 将原有的action映射到userAct方法的action去掉method属性,然后通过user!methodName.action访问发送 --> 
    <action name="user" class="userAct">
    	<result name="query">/WEB-INF/jsp/success.jsp</result>
    	<result name="editUser">/WEB-INF/jsp/editUser.jsp</result>
    	<result name="addUser">/WEB-INF/jsp/addUser.jsp</result>
    </action>

    (4)、使用通配符配置action:
           参见:struts2通配符配置

    三、拦截器(MethodFilterIntercepter)
    (1)、配置方法拦截器

    <!-- 继承MethodFilterIntercepter类 -->
    <interceptor name="delInterceptor" class="com.hzboy.common.DelInterceptor"/>
    <!-- 定义拦截器拦截规则 -->
    <interceptor-ref name="delInterceptors">
    	<!-- 在给拦截器栈添加参数时需要指定拦截器的名称 -->
    	<param name="delInterceptor.includeMethods">doDelete*</param>
    	<param name="loginInterceptor.excludeMethods">doQuery*</param>
    </interceptor-ref>

    (2)、配置action返回result时拦截
           A.新建BefureResultInterceptor继承PreResultListener。
           B.在Interceptor中注册监听器ai.addPreResultListener(new BeforeResultIntercepor());
    (3)、处理表单重复提交
           A.在表单中添加<s:token></s:token>
           B.在需要处理重复提交的action中添加拦截器<interceptor-ref name="token"/>
           C.配置重复提交时的处理页面,name值为固定值invalid.token。       如:<result name="invalid.token">/xxx.jsp</result>

    示例代码:http://download.csdn.net/detail/peng_hao1988/5929485

    》》》》》》》》》》》》》》》》转载请注明出处《《《《《《《《《《《《《《《《



  • 相关阅读:
    Vue中的混入对象mixins
    iView组件样式修改
    理解Vue.use
    webpack中的require.context
    Vue对象中的混入对象mixins
    nodejs获取客户端ip地址
    Typescript 实战 --- (3)接口
    Typescript 实战 --- (2)枚举
    进击JavaScript核心 --- (3)面向对象
    在windows中使用 nvm 实现node多版本管理
  • 原文地址:https://www.cnblogs.com/pocter/p/3684463.html
Copyright © 2011-2022 走看看