发表于: 2019-10-27 23:48:40

1 942


今天完成的事:
1、查看了SpringMVC的运行原理,如下图所示。
(1) Http请求:客户端请求提交到DispatcherServlet(前端控制器)。
(2) 寻找处理器:由DispatcherServlet控制器查询一个或多个HandlerMapping(处理器映射),根据url请求,找到匹配的Controller。
(3) 调用处理器:DispatcherServlet将请求提交到Controller(处理器,或控制器)。
(4)(5)调用业务处理和返回结果:Controller调用业务逻辑处理后,返回ModelAndView(模型和视图)。
(6)(7)处理视图映射并返回模型: DispatcherServlet查询一个或多个ViewResolver(视图解析器),找到ModelAndView指定的视图。
(8) Http响应:视图负责将结果显示到客户端。
相关配置如下:
web.xml,这里主要是指定spring全局配置文件位置,配置springmvc的前端控制器,添加了解决中文乱码的过滤器以及rest风格请求的过滤器。
<!--配置Spring的监听器,默认只加载WEB-INF目录下的applicationContext.xml配置文件-->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 指定spring的全局配置文件位置 -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!--解决中文乱码的过滤器-->
<filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<!--   springmvc只能处理post和get,还原对 put 和 delete 处理的过滤器   -->
<filter>
    <filter-name>HiddenHttpMethodFilter</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>HiddenHttpMethodFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<!-- springmvc核心,前端控制器:分发servlet -->
<servlet>
    <servlet-name>mvc-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 指定spring mvc的配置文件位置 -->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <!-- 默认拦截所有请求 -->
    <url-pattern>/</url-pattern>
</servlet-mapping>
spring全局配置文件,配置数据源,标注扫描识别dao层、service层的注解,创建sqlsessionfactory会话工厂,指定mybatis全局配置文件,指定mapper.xml文件以及指定映射器扫描的包路径。主要是负责整合mybatis。
<!--开启注解的扫描,处理service和dao,controller不需要Spring框架去处理-->
<context:component-scan base-package="com.chuilun" >
    <!--配置哪些注解不扫描-->
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!-- 开启注解 -->
<context:annotation-config />
<!-- 配置C3P0数据源 -->
<bean id="dataSource"
      class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="user" value="root"></property>
    <property name="password" value="Zhang123!"></property>
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/xzy_task3?characterEncoding=utf8"></property>
    <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
    <property name="initialPoolSize" value="5"></property>
    <property name="maxPoolSize" value="10"></property>
</bean>
<!-- 创建SqlSessionFactory,同时指定数据源 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <!-- 指定包名,别名就是类名,首字母小写 -->
    <property name="typeAliasesPackage" value="com.chuilun.pojo" />
    <!-- 引用配置好的数据源DataSource的bean -->
    <property name="dataSource" ref="dataSource"/>
    <!-- 指定mapper.xml文件的位置 -->
    <property name="mapperLocations" value="classpath:dao/*.xml"/>
    <!-- 指定mybatisConfig.xml文件的位置 -->
    <property name="configLocation" value="classpath:mybatisConfig.xml"/>
    <!-- 分页插件的配置 -->
    <property name="plugins">
        <array>
            <bean class="com.github.pagehelper.PageInterceptor">
                <property name="properties">
                    <!--使用下面的方式配置参数,一行配置一个,此处可省去 -->
                    <value>
                        <!--     分页参数合理化,当pageNum <= 0 时,
                                 会查询第一页,pageNum > pages(总数)时,
                                 会查询最后一页。
                                 默认为false时,直接根据参数查询。-->
                        <!--     reasonable=true-->
                    </value>
                </property>
            </bean>
        </array>
    </property>
</bean>
<!-- 指定包路径,自动扫描生成映射器 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <!-- 指定会话工厂,如果当前上下文中只定义了一个,此处可省去 -->
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    <property name="basePackage" value="com.chuilun.dao"/>
</bean>
springmvc.xml,则是标注扫描识别controller层的注解,配置jsp文件位置的视图解析器,配置国际化错误信息校验器。
    <!--  使用false,表示所有注解的类都不扫描 -->
    <context:component-scan base-package="com.ssm" use-default-filters="false">
        <!--配置哪些注解进行扫描-->
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
    <!-- 开启注解 -->
    <context:annotation-config/>
    <!-- 视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>
    <!--使用default服务器处理静态资源-->
    <mvc:default-servlet-handler/>
    <!-- hibernate validator 校验器 -->
    <!-- 注册校验器 -->
    <mvc:annotation-driven validator="validator"/>
    <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
        <!-- 指定校验使用的错误信息文件,如果不指定则默认使用classpath下面的validationMessage.properties文件 -->
        <property name="validationMessageSource" ref="messageSource"/>
    </bean>
    <!-- 指定校验错误信息配置文件,国际化 -->
    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <!-- 资源文件名,使用basenames,不用加后缀名,此处需注意name不是basename-->
        <property name="basenames">
            <list>
                <!-- 在web环境中一定要定位到classpath 否则默认到当前web应用下找  -->
                <value>classpath:validationMessage</value>
            </list>
        </property>
        <!-- 资源文件编码格式 -->
        <property name="fileEncodings" value="UTF-8"/>
        <!-- jsp页面编码格式 -->
        <property name="defaultEncoding" value="UTF-8"/>
        <!-- 对资源文件内容缓存时间,单位秒 -->
        <property name="cacheSeconds" value="120"/>
        <!-- 语言区域里没有找到对应的国际化文件时,默认使用validationMessage.properties文件-->
        <property name="useCodeAsDefaultMessage" value="true" />
    </bean>
    <!-- 国际化操作拦截器 如果采用基于(请求/Session/Cookie)则必需配置 -->
    <!-- 主要用于获取请求中的locale信息,将其转为Locale对像,获取LocaleResolver对象-->
    <mvc:interceptors>
        <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
    </mvc:interceptors>
    <!-- 动态切换国际化,配置SessionLocaleResolver用于将Locale对象(由语言和国家组成)存储于Session中供后续使用,类似缓存 -->
    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"/>
2、查看springmvc时,发现web.xml文件中有关log4j的监听器没有配置,但是之前用着也没有什么问题,log4j的配置文件放在resources文件夹下,也可以识别配置内容。
查了下原来使用log4j监听器可以动态改变记录级别和策略,不需要重启web应用,设置log4jRefreshInterval时间,可以每个一段时间扫描下配置文件的变化。
相关配置如下,原本是间隔60秒,我这里设为3秒,在controller类中设置三个级别trace、info、erroe插入信息,有两个日志文件,一个设置的info级别,一个是error级别。
运行后查看日志,info级别日志输出信息如下,为info、error级别信息,而后修改该日志级别配置为error,等了一会后,再点击请求,发现日志信息内不是想象中的只有error级别信息,还是info、error两个级别信息,那就是说没有实现动态修改日志级别。
百度也没有找到原因,有一个说是log4j的listener要在spring的全局listener前面,尝试后也没有解决问题。
log4j监听器:
controller类中三个级别trace、info、erroe插入信息。
3、编写作品controller、jsp。
controller类,根据关键字模糊查询作品。
这种set方式提供假数据,无论是根据关键字查询还是根据标题查询,体现的都是这个形态,这就能达到检测接口的目的了?感觉不对劲啊。。
在创建根据作品id查询留言的接口时,遇到了问题,这里是在模糊查询后的列表页面点击详情,获得作品id,再根据留言表的作品id字段、状态字段查询对应留言。
对于从详情的超链接处获得作品id感觉不知道怎么传入controller中的入参位置。。尝试运行报错。
最后得知原因,入参处需要使用@PathVariable绑定id参数,而且jsp中没有添加c标签。。
但是目前不知道怎么能把作品信息和留言信息放在同一个页面,说是这属于前端的操作,需要用到ajax,还是需要整一下,因为如果不放在同一个页面,就没办法查看留言、回复在作品下的楼层效果。。
从详情的超链接处获得作品id。

入参处使用@PathVariable绑定id参数。

查询结果添加jsp时,注意添加的变量名称。。

明天计划的事:
1、实现留言和回复的展示。
2、图片上传展示。
3、nginx动静分离。
遇到的问题:
1、log4j监听器动态改变记录级别和策略,不重启web应用,尝试失败,百度没找到原因。
2、不知道怎么能把作品信息和留言信息放在同一个页面,说是这属于前端的操作,需要用到ajax,但还是需要整一下,因为如果不放在同一个页面,就没办法查看留言、回复在作品下的楼层效果。。
收获:
1、整理了SpringMVC的运行过程。
2、查看log4j监听器的相关知识。
3、完成作品、留言的部分controller、jsp。

返回列表 返回列表
评论

    分享到