美文网首页
SpringMVC第一天

SpringMVC第一天

作者: 原来蜗牛不是牛 | 来源:发表于2017-07-20 23:08 被阅读0次

    介绍一下MVC

    1. MVC就是一个设计模式,最简单的web界面开发,我们直接写一个jsp页面就完事了,但是现在将web端分成了三层,全名是Model View Controller,是模型(model)—视图(view)—控制器(controller)的缩写,目的是为了系统的框架,分层更加清晰,可扩展性更强,降低系统的耦合度。
      MVC既然是一个设计模式,所以它既可以适用于C/S应用也可以适用于B/S应用,下面这张图介绍了在B/S模式下的应用
      MVC
      MVC的执行步骤:
    • 用户发起Request请求至控制器(Controller),控制器接收用户的请求,并将请求委托给模型进行处理。
    • 控制器请求模型(Model),模型处理业务数据并得到处理结果,模型通常是指业务逻辑,包括Pojo、Service、Dao等三层
    • 模型将处理结果返回给控制器
    • 控制器将模型数据在视图(View)中展示
      说明:web中模型无法将数据直接在视图上显示,需要通过控制器完成。如果在C/S应用中模型是可以将数据在视图中展示的。
    • 控制器将视图响应结果,Response响应给用户,通过视图展示给用户数据或者处理结果。

    MVC各部分的作用:

    • Controller的作用
      封装web请求为一个数据对象、调用业务逻辑层来处理数据对象、返回处理数据结果及相应的视图给用户。
    • Model的作用
      处理业务数据,并返回处理结果
    • View的作用
      渲染视图,并将数据或处理结果展示给用户

    什么是SpringMVC

    在Spring框架中的位置
    ![]{{1)49V(VOTG~`7YTFFN)T.png](https://img.haomeiwen.com/i3905877/4a4bad044b17fb74.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    SpringMVC是Spring框架的一个模块,我们可以从Spring的整体结构中看出来,是属于表现层的框架,是基于MVC的WEB框架

    SpringMVC工作原理图

    工作原理图

    中央控制器(DispatcherServlet):接收请求,响应结果,相当于电脑的CPU。
    处理器映射器(HandlerMapping):根据URL去查找处理器
    处理器(Handler):(需要程序员去写代码处理逻辑的)
    处理器适配器(HandlerAdapter):会把处理器包装成适配器,这样就可以支持多种类型的处理器,类比笔记本的适配器(适配器模式的应用)
    视图解析器(ViewResovler):进行视图解析,多返回的字符串,进行处理,可以解析成对应的页面

    开发步骤方式一(根据工作原理图开发,基于配置文件)

    • 配置中央控制器和过滤器
      配置在web.xml中
    <web-app>
      <display-name>Archetype Created Web Application</display-name>
      <!-- 配置spring自带的过滤器 -->
      <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>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
      </filter>
      <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
      <!-- 1.配置中央控制器 -->
      <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
        </init-param>
      </servlet>
      <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>*.action</url-pattern>
      </servlet-mapping>
    </web-app>
    
    • 配置处理器映射器(Spring配置文件中)
      applicationContext.xml
    <!-- 2.配置处理器映射器,按照bean的名称来查找 -->
        <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
    

    通过action对象的name属性来查找

    • 配置处理器适配器
    <!-- 3.配置处理器适配器 -->
        <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" ></bean>
    
    • 配置视图解析器
    <!-- 4.配置视图解析器 -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" ></bean>
    
    • 创建Action对象,通过name属性标识
    <!-- 5.配置Action,按名称查找 -->
        <bean name="/test.action" class="com.chenx.action.TestAction" ></bean>
    
    • 开发Action(实现Controler接口)
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.Controller;
    public class TestAction implements Controller {
    
        @Override
        public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
            ModelAndView mav = new ModelAndView();
            mav.setViewName("index.jsp");
            return mav;
        }
    }
    

    开发步骤方式二(基于配置文件)

    • 配置中央控制器(同上)
    • 配置处理器映射器
    <!-- 2.配置适配器映射器 -->
        <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" >
            <property name="mappings">
                <props>
                    <prop key="/test.action">testAction</prop>
                </props>
            </property>
        </bean>
    
    • 配置处理器适配器
    <!-- 3.配置适配器控制器 -->
        <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter" ></bean>
    
    • 配置视图解析器(同上)
    • 创建Action对象,通过id属性来标识,与处理器映射器相对应
    <!-- 5.创建action对象,通过id查找 -->
        <bean id="testAction" class="com.chenx.action.TestAction" ></bean>
    
    • 开发Action,实现HttpRequestHandler接口
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.springframework.web.HttpRequestHandler;
    public class TestAction implements HttpRequestHandler {
    
        @Override
        public void handleRequest(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            // TODO Auto-generated method stub
            request.getRequestDispatcher("index.jsp").forward(request, response);
        }
    }
    

    开发步骤方式三(基于注解)--推荐

    • 配置中央控制器(同上)
    • 配置处理器映射器+配置处理器适配器
    <!-- 2.配置适配器映射器  3.配置适配器控制器-->
        <mvc:annotation-driven></mvc:annotation-driven>
    
    • 配置视图解析器
    <!-- 4.配置视图解析器 -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" ></bean>
    
    • 添加注解扫描
    <!-- 5.添加注解扫描 -->
        <context:component-scan base-package="com.chenx.action"></context:component-scan>
    
    • 开发注解Action
      1.开发的注解action不用实现接口
      2.方法名称自定义
      3.路径映射名称在方法中自定义。
      4.一个模块的所有功能可以写在一个类中(多个方法)
    import java.util.ArrayList;
    import java.util.List;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.servlet.ModelAndView;
    import com.chenx.model.User;
    @Controller
    /*@RequestMapping("/test")*/
    public class TestAction {
        
        @RequestMapping("/test.action")
        protected ModelAndView testA(HttpServletRequest request,HttpServletResponse response){
            ModelAndView mav = new ModelAndView();
            String uname = request.getParameter("username");
            String upwd = request.getParameter("pwd");
            System.out.println(uname+"\t"+upwd);
            List<User> users = new ArrayList<>();
            User user1 = new User("陈枭", "aaaaaaaaa", 34);
            User user2 = new User("陈其", "bbbbbbbb", 45);
            User user3 = new User("王维虹", "ccccccc", 13);
            User user4 = new User("徐俊", "ddddddddd", 35);
            users.add(user1);
            users.add(user2);
            users.add(user3);
            users.add(user4);
            mav.addObject("users", users);
            mav.setViewName("show.jsp");
            return mav;
        }
    }
    

    工作中路径名这些定义好就不要改,因为是提供给其他同事的接口,牵一发动全身

    • 贴一下测试页面代码
      index.jsp
    <body>
    <div>
        <form action="test.action" method="post">
            <div>用户名:<input type="text" name="username" /></div>
            <div> 密码:<input type="password" name="pwd" /></div>
            <div><input type="submit" value="提交"></div>
        </form>
        </div>
    </body>
    

    show.jsp(maven默认创建servlet的版本为2.3,记得开起使用EL表达式)

    <body>
        <div>
            <table>
                <thead>
                    <tr>
                        <th>姓名</th>
                        <th>密码</th>
                        <th>年龄</th>
                    </tr>
    
                </thead>
                <tbody>
                <c:forEach items="${users }" var="u">
                    <tr>
                        <td>${u.name }</td>
                        <td>${u.pwd }</td>
                        <td>${u.age }</td>
                    </tr>
                </c:forEach>
                </tbody>
            </table>
        </div>
    </body>
    

    总结

    开发思路:

    1. 中央控制器(拦截器)
    2. 处理器映射器(找action)
    3. 处理器适配器(执行action)
    4. 视图解析器
    5. 开发action
    6. 开发View(JSP)
    7. 开发Model和数据库交互

    相关文章

      网友评论

          本文标题:SpringMVC第一天

          本文链接:https://www.haomeiwen.com/subject/ikvjkxtx.html