• SpringMVC开发入门讲义


    整个实现过程中:

    用户请求的往往是服务器的一个处理程序,这个处理程序会调用后台的数据处理。最终会把处理后的数据交付到页面上。

    开发规则:单一职责,开闭职责。

    MVC的设计模式,优点,将这个请求和响应分为了控制器,数据,视图三者,这三者彼此之间是独立。但是三者之间有关联。每次用户请求的时候经过统一的控制器处理,最终响应给客户的就是视图。耦合性降低,维护的难度降低。

    2.MVC的框架,这个框架将我们的Web开发进行整合,整合有一个总的核心的控制器,然后其它的控制器都受它的控制。

    SpringMVCSpring中的一个子框架,包含了我们Web开发的时候所采用的MVC的设计模式的实现解决方案。

    3.实现第一个SpringMVC的开发:

    1SpringMVC加入到Spring框架里。

      a.如何将applicationContext.xml设置为当我们的web启动的时候,就自动加载到内存中。在web.xml里做配置:

    <!-- 对web服务器采取监听,监听的目的就是一旦web服务器启动,那么就加载spring的配置 -->
      <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>
      <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
      </context-param>

    2)开发一个针对SpringMVC框架的配置文件,springmvc.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/mvc    
            http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"
            default-autowire="byName"
            >
    </beans>

    3)那么既然springmvc.xmlspringmvc.xml也要随着web服务器的启动而自动加载。

    注意:1)关于前端控制器中的url路径的匹配为什么会采用*.action.

       如果是采用/*,那么会将由控制器转发的jsp页面也会进入到前端控制器的拦截中,然后会映射相应的控制器, 

       这样就会导致找不到相应的控制器出错。

    <!-- 随着web服务器的加载,前端控制器(中央控制器就要初始化,并且开始工作了) -->
       <servlet>
         <servlet-name>springmvc2</servlet-name>
         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
         <init-param>
           <param-name>contextConfigLocation</param-name>
           <param-value>classpath:springmvc.xml</param-value>
         </init-param>
         <!-- load-on-startup 的值大于0就表示随着服务器启动,这个servlet就自动被初始化 -->
         <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
         <servlet-name>springmvc2</servlet-name>
         <url-pattern>*.action</url-pattern><!--配置的访问路径,一定是按照这种格式写  -->
      </servlet-mapping>

    4)开发控制器,该控制器继承自Controller

    public class TestController implements Controller {
    
        @Autowired
        private UserInfoService userInfoService;
        public UserInfoService getUserInfoService() {
            return userInfoService;
        }
        public void setUserInfoService(UserInfoService userInfoService) {
            this.userInfoService = userInfoService;
        }
        @Override
        public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
            // TODO Auto-generated method stub
            UserInfo user = new UserInfo();
            List<UserInfo> userInfoList = userInfoService.getlist(user);
            ModelAndView modelAndView = new ModelAndView();
            modelAndView.addObject("userlist",userInfoList);
            modelAndView.setViewName("/index.jsp");
            return modelAndView;
        }
    
    }

    5)将springmvc.xml里做配置,该配置将开发的bean对象加入到spring中:

    <!-- 把控制器交付给spring管理 -->
        <bean name="/getusers.action" class="com.jinglin.hotelsup.controller.TestController"></bean>
        <!-- handler路径适配器,将url的路径同bean里的name进行比对 -->
        <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
        <!-- 视图解析的bean对象 -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>

    6)页面通过jstl解析从控制器里传出的数据

    <c:forEach items="${userlist}" var="user">
               姓名:${user.username}
         </c:forEach>

    执行的流程图:

    整个SpringMVC的执行流程:

     1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;

          2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;

          3. DispatcherServlet 根据获得的Handler选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)

           4.  提取Request中的模型数据,填充Handler入参,开始执行HandlerController)在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:

          HttpMessageConveter将请求消息(如Jsonxml等数据)转换成一个对象,将对象转换为指定的响应信息

          数据转换:对请求消息进行数据转换。如String转换成IntegerDouble

          数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等

          数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中

          5.  Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;

          6.  根据返回的ModelAndView选择一个适合的ViewResolver必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet 

          7. ViewResolver 结合Model和View来渲染视图

          8. 将渲染结果返回给客户端。

    Spring工作流程描述

        为什么Spring只使用一个Servlet(DispatcherServlet)来处理所有请求?

         详细见J2EE设计模式-前端控制模式

        Spring为什么要结合使用HandlerMapping以及HandlerAdapter来处理Handler?

        符合面向对象中的单一职责原则,代码架构清晰,便于维护,最重要的是代码可复用性高。如HandlerAdapter可能会被用于处理多种Handler

    5.实际项目中开发SpringMVC,是通过注解的方式开发

     一个功能模块------->一个控制器

     开发的时候,在springmvc.xml里配置:

    <!-- 用注解的方式开发控制器 -->
       <context:annotation-config>
            <mvc:annotation-driven>
            </mvc:annotation-driven>
       </context:annotation-config>
       <!-- 引入解析jstl的类 -->
       <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
       <!-- 将控制器的包扫描到spring里 -->
       <context:component-scan base-package="com.jinglin.hotelsup.controller"></context:component-scan>

    2)开发控制器的类:

    @Controller
    public class UserInfoController {
        @Autowired
        private UserInfoService userInfoService;
        
        
        @RequestMapping(value="/login.action",method=RequestMethod.POST)
        public String userlogin(HttpServletRequest request,
                               HttpSession session){
            //request.setCharacterEncoding("utf-8");
            //获取前台传入来的数据
            String username = request.getParameter("username");
            String userpwd = request.getParameter("userpwd");
            UserInfo userInfo = new UserInfo();
            userInfo.setUsername(username);
            userInfo.setUserpwd(userpwd);
            //调用service层,得到业务数据
            List<UserInfo> list=userInfoService.getlist(userInfo);
            if(list!=null){
                if(list.size()>0){
                    UserInfo u = list.get(0);
                    session.setAttribute("user",u);
                    return "redirect:index.jsp";
                }else{
                    request.setAttribute("info","用户名或密码输入错误!");
                    return "forward:login.jsp";
                }
            }else{
            return null;
            }
        }
        
    }

    3)解决提交的时候的乱码问题:POST提交(配置在web.xml里)

    <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> 
  • 相关阅读:
    几款免费的支持HTML5的音频视频转换软件推荐
    2 宽度优先爬虫和带偏好的爬虫(4)
    Hadoop源代码分析(三)
    Hadoop源代码分析(四)
    C# 收邮件
    关于Adobe flash palyer 安装出现的问题解决方案
    C#调用java类、jar包方法。
    EF 4.3 的一些基础使用
    .net数据库连接池问题:在同一页面使用一段时间后,提示超时,连接池不够用这类的提示!
    使用Google CDN的JSAPI服务来提供加载各类JS库的方法
  • 原文地址:https://www.cnblogs.com/ljljava/p/7471421.html
Copyright © 2020-2023  润新知