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 runtimes为tomcat
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注解定义url到controller具体方法的映射,这个映射信息会被存储,一般是存储到一个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 runtimes为tomcat
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注解定义url到controller具体方法的映射,这个映射信息会被存储,一般是存储到一个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>