Spring-MVC的原理和代码实现

2016-06-16 健励信息
一:Spring-MVC原理分析:
spring-mvc原理图:
健励信息
名词解析:
Browser      :浏览器(电脑客户端)。
Phone         :手机客户端。
Servlet        :用JAVA程序编写的后端服务器。   
JavaBean   :Bean工厂,创建管理对象。 (entity:实体类;service:服务层类;dao:接口层类)
DB              :数据库。比如mysql、MariaDB等.
JSP            :Java Server Pages(前端)。
步骤解析:
1.http:客户端发送请求。按照HTTP协议发送请求。
2.服务端接收请求并把对象交给JavaBean创建、管理。
3.通过JDBC、MyBatis等方式从数据库中增删改查数据。
4.从数据库返回数据。
5.数据返回到服务端。
6.数码呈现在JSP页面上。
7.响应给看用户端(电脑客户端或者手机客户端)。按照HTTP协议响应数据。
补充:
传统的web mvc 编程架构中有什么优势,劣势?
优势:结构层次更加清晰,可读性,可维护性以及可扩展性相对较好
劣势:参数获取,类型转换,流程调用相对都比较复杂
Spring-MVC 基于XML文件的官方概要架构图:
健励信息
Spring-MVC 基于注解方式的官方概要架构图:
健励信息

名词解释:
 DispatcherServlet (前端控制器, 处理请求的入口,服务器启动时初始化),在客户端输入任何网站都会经过前端控制器,根据<url-pattern>中的配设置 过滤网站。
 HandlerMapping (映射器对象, 用于管理url与对应controller的映射关系)
Controller (后端控制器, 负责处理请求的控制逻辑)
ModelAndView (模型, 封装业务处理结果和视图)
ViewResolver(视图解析器,解析对应的视图关系:前缀+view+后缀)
步骤解析可参考上处原理图的步骤解析,此处略。
二:Spring-MVC的代码实现:
编程的基本步骤:
Step01: 创建maven web 项目并解决项目中的错误问题。
Step02: 添加项目依赖(spring-webmvc)及spring核心配置文件。
Step03:   在项目的Resource中添加核心配置文件。
Step04: 配置前端控制器DispatcherServlet(web.xml)。
Step05: 创建后端控制器(Controller)及页面。
Step06: 部署及测试springmvc 应用。
Step01:创建项目可能遇到的问题:
1) war项目默认不会创建web.xml(需要自己生成。生成web.xml:右击Maven项目Deployment Descriptor:,然后点击Generate Deployment Descriptor Stub)。
2) 项目创建好需要设置运行时环境tomcat(多个tomcat时选哪个)
3) 统一编译版本(版本不统一很有可能会出现项目不编译)
4) 统一编码(UTF-8)
5) 假如创建的项目还有问题,可对项目进行clean操作
Step02:添加依赖
打开项目的pom.xml文件,然后添加依赖(选择组groupId为org.springframework)。
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<dependencies>
Step03:在项目的resource的目录中添加核心配置文:
<?xml version="1.0" encoding="UTF-8"?>
<beans default-lazy-init="true"
    xmlns="http://www.springframework.org/schema/beans" 
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:util="http://www.springframework.org/schema/util"
    xmlns:jpa="http://www.springframework.org/schema/data/jpa"
    xsi:schemaLocation="  
       http://www.springframework.org/schema/beans   
       http://www.springframework.org/schema/beans/spring-beans-4.3.xsd  
       http://www.springframework.org/schema/mvc   
       http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd   
       http://www.springframework.org/schema/tx   
       http://www.springframework.org/schema/tx/spring-tx-4.3.xsd   
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
       http://www.springframework.org/schema/util
       http://www.springframework.org/schema/util/spring-util-4.3.xsd
       http://www.springframework.org/schema/data/jpa
       http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-4.3.xsd" >  
</beans>

配置前端控制器
 <servlet>
     <servlet-name>dispatcherServlet</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>
     <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
     <servlet-name>dispatcherServlet</servlet-name>
     <url-pattern>*.do</url-pattern>
  </servlet-mapping>


创建后端控制器
后端控制器编写时可以实现Controller接口,然后重写handleRequest方法处理请求
public class HelloController implements Controller{
public ModelAndView handleRequest(
HttpServletRequest request,HttpServletResponse response) {
ModelAndView mv=new ModelAndView("hello");
mv.addObject("message","helloworld");
return mv;
}
}
 
其中:
ModelAndView对象为一个模型与视图对象,内置一个map对象,主要用于封装业务数据和视图名。
ModelAndView构造方法中传递的为视图名,addObject方法可以以key/value形式存储数据。
ModelAndView 对象返回时会被spring mvc自动存储到请求作用域,在对应的视图页面可以直接从此作用域获取对应的值。
 
 创建JSP页面
 
在项目的WEB-INF/pages文件夹下创建hello.jsp文件,然后设置其内容,例如
 
<body>
   <h1>${message}</h1>
</body>
 
配置后端控制及视图解析
在spring mvc 核心配置文件中添如下配置。
 
<!-- Controller这个Bean对象交给Spring管理 -->
<bean id="helloController" class="spring.controller.XmlHelloController">
</bean>
<!-- 配置HandlerMapping 映射处理器配置url到具体的Controller之间的映射-->
 <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
             <property name="mappings">
                  <props>
                      <prop key="/hello.do">helloController</prop>
                  </props>
             </property>
  </bean>
  <!-- 配置视图解析器 -->
 <bean  id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/pages/"/>
            <property name="suffix" value=".jsp"/>
</bean>
部署到tomcat运行:
将项目部署到tomcat,然后启动运行,在地址栏输入具体url访问对应controller。
基于注解编程实现
创建Maven WEB 项目
Maven Web  项目打包方式为war方式
Maven Web  项目的target runtimestomcat
Maven Web  项目的编译版本为JDK1.8
Maven WEB 项目的编码方式设置为UTF-8
 
Spring官方网址: http://spring.io/projects
 添加Spring MVC 项目依赖及配置文件
打开项目的pom.xml文件,然后添加依赖
 
 
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
 
 
假如添加好了依赖,都没有找到对应的jar依赖,先检测网络是否是通的.假如网络是通的,还没有下载到具体的依赖,此时要右键项目,选择maven/upate maven project/fore update…进行maven强制更新操作.
 
在项目的resource的目录中添加核心配置文件applicationContext.xml,例如:
 
<?xml version="1.0" encoding="UTF-8"?>
<beans default-lazy-init="true"
    xmlns="http://www.springframework.org/schema/beans" 
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:util="http://www.springframework.org/schema/util"
    xmlns:jpa="http://www.springframework.org/schema/data/jpa"
    xsi:schemaLocation="  
       http://www.springframework.org/schema/beans   
       http://www.springframework.org/schema/beans/spring-beans-4.3.xsd  
       http://www.springframework.org/schema/mvc   
       http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd   
       http://www.springframework.org/schema/tx   
       http://www.springframework.org/schema/tx/spring-tx-4.3.xsd   
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
       http://www.springframework.org/schema/util
       http://www.springframework.org/schema/util/spring-util-4.3.xsd
       http://www.springframework.org/schema/data/jpa
       http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-4.3.xsd" >
       
</beans>
 
 
 配置前端控制器
打开web.xml,配置DispatcherServlet对象
<servlet>
     <servlet-name>dispatcherServlet</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>
     <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
     <servlet-name>dispatcherServlet</servlet-name>
     <url-pattern>*.do</url-pattern>
  </servlet-mapping>
前端控制器是spring mvc处理请求的入口,是springmvc的核心。
 
创建后端控制器
 
@Controller
@RequestMapping("/")
public class AnnotationHelloController {
@RequestMapping("doSayHello")
public ModelAndView doSayHello() {
ModelAndView mv=new ModelAndView("hello");
mv.addObject("message", "helloworld");
return mv;
}
@RequestMapping("doSayWelcome")
public String doSayWelcome() {
       return "hello";
}
@RequestMapping("doHandleRequest")
public String doHandleRequest(Model m) {
         m.addAttribute("message","welcome to beijing");
       return "hello";
}
}
 
其中
通过@RequestMapping注解定义urlcontroller具体方法的映射,这个映射信息会被存储,一般是存储到一个HandlerMapping对象中.
 
配置组件扫描与视图解析
 
spring mvc 核心配置文件中添加
 
 
<!-- 配置组件扫描 -->
<context:component-scan base-package="com.company"/>
<!—启用MVC注解扫描 -->
<mvc:annotation-driven/>
<!-- 配置视图解析器 -->
<bean  id="viewResolver" 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver">
     <property name="prefix" value="/WEB-INF/pages/"/>
     <property name="suffix" value=".jsp"/>
</bean>

 <servlet>
     <servlet-name>dispatcherServlet</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>
     <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
     <servlet-name>dispatcherServlet</servlet-name>
     <url-pattern>*.do</url-pattern>
  </servlet-mapping>
创建后端控制器
后端控制器编写时可以实现Controller接口,然后重写handleRequest方法处理请求
public class HelloController implements Controller{
public ModelAndView handleRequest(
HttpServletRequest request,HttpServletResponse response) {
ModelAndView mv=new ModelAndView("hello");
mv.addObject("message","helloworld");
return mv;
}
}
 
其中:
ModelAndView对象为一个模型与视图对象,内置一个map对象,主要用于封装业务数据和视图名。
ModelAndView构造方法中传递的为视图名,addObject方法可以以key/value形式存储数据。
ModelAndView 对象返回时会被spring mvc自动存储到请求作用域,在对应的视图页面可以直接从此作用域获取对应的值。
 
 创建JSP页面
 
在项目的WEB-INF/pages文件夹下创建hello.jsp文件,然后设置其内容,例如
 
<body>
   <h1>${message}</h1>
</body>
 
配置后端控制及视图解析
在spring mvc 核心配置文件中添如下配置。
 
<!-- Controller这个Bean对象交给Spring管理 -->
<bean id="helloController" class="spring.controller.XmlHelloController">
</bean>
<!-- 配置HandlerMapping 映射处理器配置url到具体的Controller之间的映射-->
 <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
             <property name="mappings">
                  <props>
                      <prop key="/hello.do">helloController</prop>
                  </props>
             </property>
  </bean>
  <!-- 配置视图解析器 -->
 <bean  id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/pages/"/>
            <property name="suffix" value=".jsp"/>
</bean>
部署到tomcat运行:
将项目部署到tomcat,然后启动运行,在地址栏输入具体url访问对应controller。
基于注解编程实现
创建Maven WEB 项目
Maven Web  项目打包方式为war方式
Maven Web  项目的target runtimestomcat
Maven Web  项目的编译版本为JDK1.8
Maven WEB 项目的编码方式设置为UTF-8
 
Spring官方网址: http://spring.io/projects
 添加Spring MVC 项目依赖及配置文件
打开项目的pom.xml文件,然后添加依赖
 
 
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
 
 
假如添加好了依赖,都没有找到对应的jar依赖,先检测网络是否是通的.假如网络是通的,还没有下载到具体的依赖,此时要右键项目,选择maven/upate maven project/fore update…进行maven强制更新操作.
 
在项目的resource的目录中添加核心配置文件applicationContext.xml,例如:
 
<?xml version="1.0" encoding="UTF-8"?>
<beans default-lazy-init="true"
    xmlns="http://www.springframework.org/schema/beans" 
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:util="http://www.springframework.org/schema/util"
    xmlns:jpa="http://www.springframework.org/schema/data/jpa"
    xsi:schemaLocation="  
       http://www.springframework.org/schema/beans   
       http://www.springframework.org/schema/beans/spring-beans-4.3.xsd  
       http://www.springframework.org/schema/mvc   
       http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd   
       http://www.springframework.org/schema/tx   
       http://www.springframework.org/schema/tx/spring-tx-4.3.xsd   
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
       http://www.springframework.org/schema/util
       http://www.springframework.org/schema/util/spring-util-4.3.xsd
       http://www.springframework.org/schema/data/jpa
       http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-4.3.xsd" >
       
</beans>
 
 
 配置前端控制器
打开web.xml,配置DispatcherServlet对象
<servlet>
     <servlet-name>dispatcherServlet</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>
     <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
     <servlet-name>dispatcherServlet</servlet-name>
     <url-pattern>*.do</url-pattern>
  </servlet-mapping>
前端控制器是spring mvc处理请求的入口,是springmvc的核心。
 
创建后端控制器
 
@Controller
@RequestMapping("/")
public class AnnotationHelloController {
@RequestMapping("doSayHello")
public ModelAndView doSayHello() {
ModelAndView mv=new ModelAndView("hello");
mv.addObject("message", "helloworld");
return mv;
}
@RequestMapping("doSayWelcome")
public String doSayWelcome() {
       return "hello";
}
@RequestMapping("doHandleRequest")
public String doHandleRequest(Model m) {
         m.addAttribute("message","welcome to beijing");
       return "hello";
}
}
 
其中
通过@RequestMapping注解定义urlcontroller具体方法的映射,这个映射信息会被存储,一般是存储到一个HandlerMapping对象中.
 
配置组件扫描与视图解析
 
spring mvc 核心配置文件中添加
 
 
<!-- 配置组件扫描 -->
<context:component-scan base-package="com.company"/>
<!—启用MVC注解扫描 -->
<mvc:annotation-driven/>
<!-- 配置视图解析器 -->
<bean  id="viewResolver" 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver">
     <property name="prefix" value="/WEB-INF/pages/"/>
     <property name="suffix" value=".jsp"/>
</bean>