暑假学习9(7.22 周三)

               今天主要学习的是对agriculture-mvc这个工程的一些配置文件的了解。首先,我们从agriculture-mvc-servlet.xml页面开始认识,在第二行是一个父类的beans(这个在每一个servlet的配置文件中都是有且仅有一个),在运行程序前会先通过其中的地址进行校验servlet.xml页面中标签是否使用正确。在这个工程中,我们在controller中加入了一个device的参数,这个参数的作用是用来判断访问controller的设备类型,当然我们这里只考虑了电脑和手机两类,并没有细分,但是这个device类的使用是springMVC的自带的,但是我们需要在agriculture-mvc-servlet.xml文件中配置相应的<bean>用来识别不同的设备,支持设备的类型判断,以下是其中关于设备识别的配置(识别的方法是device.isNormal(),真返回电脑的对应页面,假返回手机的对应页面)。

<mvc:interceptors>

<bean class="org.springframework.mobile.device.DeviceResolverHandlerInterceptor" />

<bean class="org.springframework.mobile.device.site.SitePreferenceHandlerInterceptor" />

</mvc:interceptors>

<mvc:annotation-driven>

<mvc:argument-resolvers>

<bean class="org.springframework.mobile.device.DeviceWebArgumentResolver" />

<bean class="org.springframework.mobile.device.site.SitePreferenceWebArgumentResolver" />

</mvc:argument-resolvers>

</mvc:annotation-driven>

            在下边的agriculture-mvc-servlet.xml文件中,我们可以找到一个用于解决系统崩溃的错误解析器,这个解析器的作用是将我们的错误信息返回到一个对应的页面,保证我们在无法看到后台程序运行问题的情况下找到程序运行的具体问题以便于尽快解决程序问题。在这个解析器的<bean>中,我们可以看到其参考的class是我们自己定义的一个包下的类名为HandlerExceptionResolverImpl的类。这个类继承了springMVC的一个名为SimpleMappingExceptionResolver的错误解析类。

<bean id="exceptionResolver" class="cn.agriculture.common.exception.HandlerExceptionResolverImpl">

<property name="exceptionMappings">

             <props>

                 <prop key="java.lang.Exception">manager/error</prop>

                 <prop key="java.lang.Throwable">manager/error</prop>

             </props>

         </property>

         <property name="statusCodes">

             <props>

                 <prop key="manager/error">500</prop>

                 <prop key="manager/error">404</prop>

             </props>

         </property>

         <!-- 设置日志输出级别,不定义则默认不输出警告等错误日志信息 -->     

         <property name="warnLogCategory" value="WARN"></property>     

         <!-- 默认错误页面,当找不到上面mappings中指定的异常对应视图时,使用本默认配置 -->     

         <property name="defaultErrorView" value="manager/error"></property>     

         <!-- 默认HTTP状态码 -->     

         <property name="defaultStatusCode" value="500"></property> 

</bean>

            在上边的bean中,我们可以发现它包含了错误代码404与错误代码500,这样我们在程序运行出现对应的错误时可以不显示错误页面404与500而是相应的显示我们的manager文件夹下的error页面,将我们找到的错误信息显示在页面上以便于寻找问题。在我们的错误提示页面即error中,我们用的是一个jsp文件,在这个页面中通过${exceptionMessage}来显示错误的信息,注意在这个页面上还有一个返回首页的按钮,这个按钮是在一个<form>中提交的。在这里,我们需要关注这个form的action属性值:action="${pageContext.request.contextPath}/",不同于html中的返回首页:action="@{/}"。

           今天学习的这个工程中需要用到很多数据,其中包括大量的值查询和图片查询。在第一次登陆页面的首页时会比较慢,这是因为我们同时进行大量数据查询时会开辟多个线程来执行查询操作。尽管如此,总是查询大量数据都是比较浪费时间的,所以我们将我们第一次查询得到的图像存储到一个二进制的缓冲区中以方便我们在刷新页面时可以快速的从缓冲区中找到对应的二进制流对象得到一个图片减少查询时间的损耗。下面的代码就是缓冲区的相关配置:

<!-- 配置eh缓存管理器 -->

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"/>

<!-- 配置一个简单的缓存工厂bean对象 -->

<bean id="simpleCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">

   <property name="cacheManager" ref="cacheManager" />

   <!-- 使用缓存 关联ehcache.xml中的缓存配置 -->

   <property name="cacheName" value="pictureCache" />

</bean>

         缓冲区的使用主要是在查询商品的图片上,我们主要通过showImage这个路径来使用showImage方法,这个方法首相通过对应的commodityForm提供一个商品信息,然后再缓冲区的二进制流中进行查找,如果找到就将其返回到一个OutputStream类的对象,我们通过write方法将其写入,再是通过flush方法将所有缓冲数据写入到response的返回页面中。在查询时使用了CommodityService这个服务,这个服务中加入了

@Autowired

Cache pictureCache;

              通过一个自动注入,我们可以使用缓冲区,并从缓冲区中提取我们需要的图片二进制流,在这个服务中,我们查找图像并不是仅通过缓冲区,首先进行了一个判断(缓冲区中是否有我们需要的二进制流对象),在没有时要通过数据库进行查询得到,还没有就返回图片不存在,补充的信息。注意在配置缓冲区的value值和我们CommodityService中自动注入的缓冲区类型的名字一样。

           md5的验证和RSA的验证不同,md5验证需要可信赖的第三方交易平台来参与,在卖家与买家的交易完成之前,所有款项都是在第三方,只有双方认同交易完成,款项才可以到达对应的买家账户。(实际上可以参考淘宝的交易,这个使用的就是md5的验证)。

       关于静态方法与动态方法的区别:动态方法的使用是在使用前需要先实例化一个相应的类的对象,而在静态的方法中总是可以直接通过类名来直接使用方法。所以,静态方法(有static标志的方法)一般只用于处理一些计算操作,这样的方法是在程序中申请了一块固定的内存空间,而动态的则是在使用时申请一个空间,并在这块空间内执行相应的操作,这样不容易因为共享一个空间出现返回结果的错误。

         在数据库的查询操作中要特别注意多个表的连接时需要添加where条件语句,使得对应的项相等作为连接的条件,通过这样的条件语句我们才可以实现多个标的数据连接。

        在mybatis的模糊查询中,需要注意的是sqlMap中查询语句的like后边语句的书写方法(下面是在mysql中的写法):

1.     like      '%$commodityName$%'

注意这种写法安全性差,容易出现注入攻击

2.    like       concat('%',#commodityName#,'%')

这是实现了一个拼接,我们将三个字符串通过concat函数来实现拼接的作用。

          在HTML的前台页面中判读session对象的值是否为空的方法是在一个标签中添加th:if属性,具体代码如下:

          th:if="${#strings.isEmpty(session.UVO.guestName)}" 

         这个属性值为真时其后边的标签才会起作用,否则一起消失。在判读不为空时 :

           th:if="${not #strings.isEmpty(session.UVO.guestName)}"

          注意:在jsp中对应的是用<c:if >标签来判断的,这里的后台sesion传到前台是通过sessionScope来得到对应的值的,写法如下:

 <c:if test="${sessionScope.UVO.guestName==null}">

<meta http-equiv="REFRESH" content="0;url=initGuestLogin">

 </c:if>

         在一个jsp的页面中加入其他jsp页面的方法是:

<jsp:include page="/WEB-INF/jsp/shop/userBar.jsp"></jsp:include>

      在HTML中加入一个HTML页面是通过th:replace属性值来实现的:

<div th:replace="shop/userBar :: page-user-bar"></div>(这里的div可以是其他标签)

     在一个jsp的页面传值到后台用的是modelAttribute这个属性,写法如下:

     modelAttribute="${cartForm}"

         







你可能感兴趣的:(暑假学习9(7.22 周三))