springmvc原理图及HelloWorld

springmvc

链接自取

官方文档
lib.rar
HelloWorld

优点

1.轻量级,不需要依赖
2.高效,基于MVC框架
3.与Spring兼容好
4.约定优于配置
5.功能强大
6.简洁灵活

偏微观的springmvc原理图

springmvc原理图
1、用户发送请求至前端控制器DispatcherServlet。

2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。

3、处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

4、 DispatcherServlet调用HandlerAdapter处理器适配器。

5、HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。

6、Controller执行完成返回ModelAndView。

7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。

8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器。

9、ViewReslover解析后返回具体View.

10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。

11、DispatcherServlet响应用户。

宏观点的流程图

springmvc原理图
1.DispacherServlet表示前端控制器,是整个SpringMVC的控制中心,用户发出请求,DispacherServlet接受请求并拦截请求。

url:http://localhost:8080(服务器域名)/springmvc(web站点)/hello(控制器)

web.xml中的代码--配置DispacherServlet

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
      <servlet>
            <servlet-name>springmvc</servlet-name>
            <servlet-class>
                  org.springframework.web.servlet.DispatcherServlet
            </servlet-class>
            <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
            <servlet-name>springmvc</servlet-name>
            <url-pattern>/</url-pattern>
      </servlet-mapping>
</web-app>

2.HandlerMapping为处理器映射。DispacherServlet调用HandlerMapping,HandlerMapping根据请求的url查找Handler。

springmvc-servlet.xml的代码

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"  "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
      <bean id="simpleUrlHandlerMapping"
            class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
            <property name="mappings">
                  <props>
                        <prop key="/index">indexController</prop>
                  </props>
            </property>
      </bean>
      <bean id="indexController"  class="controller.IndexController"></bean>    //controller的配置
</beans>

3.HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器

4.HandlerExecution将解析后的信息传递给DispacherServlet

5.HandlerAdapter表示处理器适配器,并按照特定的规则执行Handler。

6.Handler让具体的Controller执行。

springmvc-servlet.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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd">
<beans>
      <bean id="simpleUrlHandlerMapping"
             class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
            <property name="mappings">
                  <props>
                        <prop key="/index">indexController</prop>
                  </props>
            </property>
      </bean>
      <bean id="indexController"   class="controller.IndexController"></bean>
</beans>

7.Controller将具体的执行信息返回给HandlerAdapter

controller控制器的代码


public class IndexController implements Controller {
      public ModelAndView handleRequest(HttpServletRequest request,  HttpServletResponse response) throws Exception {
           
            //ModelAndView 模型和视图
            ModelAndView mav = new ModelAndView("index.jsp");

            //封装对象
            mav.addObject("message", "Hello Spring MVC");


            return mav;
      }
}

8.HandlerAdapter将视图逻辑名或模型传递给DispacherServlet

9.DispacherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。

10.视图解析器将解析视图名传给DispacherServlet。

11.DispacherServlet根据视图解析器的视图结果,调用具体的视图

12.将结果返回用户

完整代码
1.编写视图页
<html>
<head>
</head>
<body>
${msg}
</body>
</html>
2.配置web.xml的代码

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
   
   <!-- 配置DispacherServlet:请求分发器,前端控制器 -->
   <servlet>
   
       <servlet-name>springmvc</servlet-name>
       <servlet-class>org.springframework.web.servlet.DispacherServlet</servlet-class>
       
       <!-- DispacherServlet配置文件绑定spring的配置文件 -->
       <init-param>
             <param-name>contextConfigLocation</param-name>
             <param-value>classpath:springmvc-servlet.xml</param-value>
       </init-param>
       
       <!-- 启动时间 -->
       <load-on-startup>1</load-on-startup>
       
   </servlet>
   
   <servlet-mapping>
   
       <servlet-name>springmvc</servlet-name>
       <url-pattern></url-pattern>
       
   </servlet-mapping>
   
</web-app>
3.配置springmvc-servlet.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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd">
<!-- 模拟开发过程 -->
      <!-- 第一步:映射器 -->
      <bean   class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
      <!-- 第二步:适配器 -->
      <bean   class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
      <!-- 第三步:视图解析器 -->
       <bean   class="org.springframework.web.servlet.view.InternalResourceViewResolver">
             <property name="prefix" value="/WEB-INF/"></property>
             <property name="suffix" value=".jsp"></property>
       </bean>

      <!-- BeanNameUrlHandlerMapping -->
      <bean id="/test"   class="com.how2java.controller.HelloController"></bean>

</beans>
4.写自己的controller

public class HelloController implements Controller {
      @Override
      public ModelAndView handleRequest(HttpServletRequest arg0,  HttpServletResponse arg1) throws Exception {
            ModelAndView mv = new ModelAndView();
            
            //业务代码
            String result = "我是结果!!!";
            mv.addObject("msg",result);
            
            //视图跳转
            mv.setViewName("test");
            
            return mv;
      }
}
注解版springmvc
1.配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
          http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
         
         
         <!-- 配置DispacherServlet:请求分发器,前端控制器 -->
   <servlet>
   
       <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispacherServlet</servlet-class>
       
       <!-- DispacherServlet配置文件绑定spring的配置文件 -->
       <init-param>
             <param-name>contextConfigLocation</param-name>
             <param-value>classpath:springmvc-servlet.xml</param-value>
       </init-param>
       
       <!-- 启动时间 -->
       <load-on-startup>1</load-on-startup>
       
   </servlet>
   
   <servlet-mapping>
   
       <servlet-name>springmvc</servlet-name>
       <url-pattern></url-pattern>
       
   </servlet-mapping>
   
</web-app>
2.配置springmvc-servlet.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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd">
      <!-- 自动扫描包 -->
      <context:component-scan  base-package="com.how2java.controller"></context:component-scan>
      <!-- 默认的过滤--css,js,jq等 -->
      <mvc:default-servlet-handler/>
      <!-- 自动映射,自动适配 -->
      <mvc:annotation-driven></mvc:annotation-driven>
      <!-- 视图解析器 -->
      <bean  class="org.springframework.web.servlet.view.InternalResourceViewResolver">
             <property name="prefix" value="/WEB-INF/jsp/"></property>
             <property name="suffix" value=".jsp"></property>
    </bean>
    
</beans>
3.controller的代码

package com.how2java.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
      
      @RequestMapping("/hello")
      public String hello(Model model) {
            
            //封装数据
            model.addAttribute("msg","结果打印");
            
            return "hello";
      }
}
4.视图层的代码

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
      ${msg}
</body>
</html>
注解版简化代码
web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
      <servlet>
            <servlet-name>springmvc</servlet-name>
            <servlet-class>
                  org.springframework.web.servlet.DispatcherServlet
            </servlet-class>
            <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
            <servlet-name>springmvc</servlet-name>
            <url-pattern>/</url-pattern>
      </servlet-mapping>
</web-app>
springmvc-servlet.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:context="http://www.springframework.org/schema/context"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
      http://www.springframework.org/schema/context         
      http://www.springframework.org/schema/context/spring-context-3.0.xsd">
      
      <context:component-scan base-package="com.how2java.controller" />
      <bean id="irViewResolver"
            class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/jsp/" />
            <property name="suffix" value=".jsp" />
      </bean>
</beans>
package com.how2java.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller    //代表这个类会被spring接管,被接管的类中所有的方法如果返回值是String,并且有页面跳转,那么就会被视图器解析。
public class HelloController {
      //访问的地址
      @RequestMapping("/hello")
      public String test(Model model) {
            model.addAttribute("msg","hhhhh");
            
            //返回"hello"去拼地址
            return "hello";
      }
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
      ${msg }
</body>
</html>

@RequestMapping在类上写和在方法上写是不一样的,在类上是所有方法都加了一层,在方法上只是你这一个方法。

多个请求都指向一个视图,视图是被复用的,控制器和视图之间是弱耦合关系。

RestFul风格

功能:使用不同的方法对资源进行操作。

优点:简洁,高效,安全

传统的方法:通过不同的参数来实现不同的效果,方法单一,post和get。
使用RestFul:直接通过不同的请求方式来实现不同的效果,不需要通过传不同的参数实现。

通过传统方式来进行传参

@RequestMapping("/add")
      public String test(int a,int b,Model model) {
            int res = a+b;
            model.addAttribute("msg","结果为"+res);
            return "hello";
      }

在springmvc中可以使用@PathVariable注解,让方法参数的值对应绑定到一个URL模板变量上。

@RequestMapping("/add/{a}/{b}")
      public String test(@PathVariable int a,@PathVariable int b,Model  model) {
            int res = a+b;
            model.addAttribute("msg","结果为"+res);
            return "hello";
      }

RestFul有四种常用的请求方式
GET POST PUT DELETE

限制访问方式的两种方法
一是直接在参数里面写上方法限制

@RequestMapping("/add/{a}/{b},method=RequestMethod.Get")

二是可以用@GetMapping或者@PostMapping去替代@RequestMapping用来限制访问方式。(好像低版本不支持,目前还不知道是什么除了问题)

@GetMapping("/add/{a}/{b})

没有视图解析器的情况下,自己转发,重定向也可以实现。直接return一个地址即可,可以在地址前加入限制。

package com.how2java.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class HelloController {
      @RequestMapping("/add/{a}/{b}")
      public String test(@PathVariable int a,@PathVariable int b,Model  model) {
            int res = a+b;
            model.addAttribute("msg","结果为"+res);
            return "/index.jsp";  //return "forword:/index.jsp"  //return "redirect:/index.jsp"
      }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值