• SpringMVC笔记


    Struts1是采用单例模式的,在并发访问中出来资源混乱,于是出现Struts2被设计为多例的解决并发产生的
    数据混乱
    由于Struts2引入了值栈,拦截器,OGNL等,,,是访问速度下降
    在原生的JSP中无需构建多余架构所以访问效率最高!
    SpringMVC出现解决了访问速度问题,仅次于JSP的访问速度

    SpringMVC初始化:
    1、HttpServletBean调用init方法初始化参数,创建BeanWrapper对象
    2、创建WebApplicationContext对象。初始化Spring容器
    3、onRefresh方法加载配置文件
    4、初始化HandlerMappings HandlerAdapters ViewResolvers等

    MVC构成
    Control: HandlerMapping:负责映射用户的URL和处理类之间的联系
    HandleAdapters:处理URL的请求,真正执行我们的代码
    Model:ModelAndView是连接业务逻辑层和视图层的桥梁
    View:RequesrToViewNameTranslator/ViewResolver


    1.修改web.xml-------服务器启动时先加载web.xml(框架的初始化)

    web.xml下访问节点的顺序 ---context-param -> listener(哪个在前面就执行那个) -> filter(
    哪个在前面就执行那个) -> servlet

    2、spring提供中文乱码问题 org.springframework.web.filter.CharacterEncodingFilter
    implements Filter

    <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>

    3、上下文的初始化
    <listener>
    <listener-
    class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    4、声明应用范围内的上下文及参数,此时全部的访问都经过SpringMVC的DispatcherServlet
    <context-param>
    <param-name>contextConfigLocation</param-name>
    <!-- 放在/WEB-INF下面 数据库+spring配置文件 -->
    <param-value>
    /WEB-INF/applicationContext.xml,
    /WEB-INF/springmvc-servlet.xml
    </param-value>
    </context-param>



    5、配置BeanNameUrlHandlerMapping 可用注解

    (1) 在spring 2.5之前的版本:使用
    <bean
    class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
    <bean
    class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
    <bean id="viewResolver"
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    (2) 在spring2.5之后出现注解: 什么是注解?
    使用的 HandlerMapping, HandlerAdapter是
    <bean
    class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping />
    <bean
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
    <bean id="viewResolver"
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    (3)在使用spring3.1开始的版本,
    使用的 HandlerMapping, HandlerAdapter是
    <bean
    class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping />
    <bean
    class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />
    <bean id="viewResolver"
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">

    <!-- 配置为BeanNameUrlHandlerMapping -->
    <!-- <bean name="/hello"
    class="com.noannotation.TestNoAnnotation"></bean> -->

    <!-- 表示将请求的Url和bean名字映射,如url为"上下文/hello",则Spring配置
    文件必须有一个名字为/hello的bean,上下文默认忽略 -->
    <!--<bean
    class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />-->

    <!-- page 11 -->
    <!--<bean
    class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />-->


    6、ViewResolver
    <bean id="viewResolver"
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!-- <property
    name="viewClass"><value>org.springframework.web.servlet.view.JstlView</value></property> -->
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />
    </bean>

    7、开启注解
    <context:component-scan base-package="com.swsoft" /><!-- 扫描
    com.swsoft文件下的所有注解 -->
    <!-- 开启注解 -->
    <mvc:annotation-driven validator="validator" conversion-
    service="conversion-service" />


    8、验证框架配置
    <!-- 下面配置主要用来验证ValidateController.java, 验证中有国际化 -->
    <bean id="validator"
    class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
    <property name="providerClass"
    value="org.hibernate.validator.HibernateValidator"/>
    <!--不设置则默认为classpath下的
    ValidationMessages.properties-->
    <property name="validationMessageSource" ref="messageSource"/>
    </bean>

    <!-- 验证之后的错误数据定义在哪个文件里面 -->
    <bean id="messageSource"
    class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <!--这两个都可以 classpath是在原包(src)的根目录-->
    <!--<property name="basename"
    value="classpath:resources/config/validatemessages"/>-->
    <property name="basename"
    value="classpath::resources/config/validatemessages"/>
    <property name="fileEncodings" value="utf-8"/>
    <!--<property name="cacheSeconds" value="120"/>-->
    </bean>


    9、

    <!-- 数据转换(从jsp到后台(servlet)的convert spi, 从后台(servlet)到jsp页面的formatter
    spi(数据格式化)-->
    <bean id="conversion-service"
    class="org.springframework.format.support.FormattingConversionServiceFactoryBean" />


    10、跳转页面
    return "redirect:/user/selectAll"; 跳转到Controller中的selectAll
    return "forward:/user/selectAll";
    mv.setViewName("/usermanage/search"); 跳转到页面/usermanage/search.jsp

    11、传参
    public String update(String id,String name,String pwd){} 默认匹配页面name值

    public String deleteAll(@RequestParam("id")String[] ids){} 获得id转化为数组

    public ModelAndView login(HttpServletRequest request, HttpServletResponse
    response){} 传统的servlet传参

    public String insert(User user,MultipartFile uploadfile) throws Exception{}
    传自定义对象

    12、上传文件
    配置springmvc-servlet.xml
    <!-- 上传文件配置 -->
    <bean id="multipartResolver"
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="1048760"></property><!-- 10M -->
    </bean>

    表单设置:
    method="post" enctype="multipart/form-data"
    <input type="file" name="uploadfile"/>

    Controller接受File类型数据
    MultipartFile uploadfile接受
    FileUtils.writeByteArrayToFile(new File("C:\" + format.format(date) +
    ".jpg"), uploadfile.getBytes());上传文件

    13、拦截器

    拦截器是AOP的一种实现,struts2 拦截器采用xwork2的interceptor!
    spring的AOP基于IoC基础,其底层采用动态代理与CGLIB代理两种方式结合的实现方式。

    常见应用场景
    1、日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等。
    2、权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面;
    3、性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始
    时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录)

    4、通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如
    提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现。
    5、OpenSessionInView:如Hibernate,在进入处理器打开Session,在完成后关闭Session。

    public class MyInterceptor implements HandlerInterceptor {

    //最后执行
    public void afterCompletion(HttpServletRequest arg0,
    HttpServletResponse arg1, Object arg2, Exception arg3)
    throws Exception {
    }

    //当preHandle返回true时执行改方法
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
    Object arg2, ModelAndView arg3) throws Exception {
    }

    //在controller层方法执行前执行该方法,
    //当它返回为false 时,表示请求结束,后续的Interceptor 和Controller 都不会再执
    行;
    //当返回值为true 时就会继续调用下一个Interceptor 的preHandle 方法,
    如果已经是最后一个Interceptor 的时候就会是调用当前请求的Controller 方
    法。
    public boolean preHandle(HttpServletRequest request, HttpServletResponse
    response,
    Object object) throws Exception {
    return false;
    }

    }


    多个拦截器执行顺序:
    <!-- 拦截器 -->
    <mvc:interceptors>
    <mvc:interceptor>
    <mvc:mapping path="/user/**"/>
    <bean class="com.interceptor.MyInterceptor"></bean>
    </mvc:interceptor>
    </mvc:interceptors>

    <mvc:interceptors>
    <mvc:interceptor>
    <mvc:mapping path="/user/**"/>
    <bean class="com.interceptor.MyInterceptor2"></bean>
    </mvc:interceptor>
    </mvc:interceptors>

    <mvc:interceptors>
    <mvc:interceptor>
    <mvc:mapping path="/user/**"/>
    <bean class="com.interceptor.MyInterceptor1"></bean>
    </mvc:interceptor>
    </mvc:interceptors>

    执行结果:
    method:public
    org.springframework.web.servlet.ModelAndView com.controller.UserController.selectAll()
    preHandle
    执行所有的preHandle method:public org.springframework.web.servlet.ModelAndView
    com.controller.UserController.selectAll()
    preHandle2
    method:public
    org.springframework.web.servlet.ModelAndView com.controller.UserController.selectAll()
    preHandle1

    执行controller 查询到的记录总数为:6
    postHandle1
    执行postHandle(栈)postHandle2
    postHandle

    afterCompletion1
    执行afterCompletion afterCompletion2
    afterCompletion

  • 相关阅读:
    MVC Form
    The way to learn english
    Test FastThree
    C#中Trim()、TrimStart()、TrimEnd()的用法
    c# Dictionary 简介
    visual studio快捷键大全
    ASP.NET MVC 中 ActionResult
    MVC4中使用 Ninject
    MVC Chapter 12 Overview of MVC Projects
    ASP.NET Razor
  • 原文地址:https://www.cnblogs.com/huanglufei/p/5878297.html
Copyright © 2020-2023  润新知