java框架5-Spring MVC
Posted Lazy的笔记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java框架5-Spring MVC相关的知识,希望对你有一定的参考价值。
MVC设计模式
视图View-对应组件:JSP或者html文件
控制器(Controller)-对应组件:Servlet
模型(Model)-对应组件:JavaBean(dao/pojo/service)
dao:数据接口层
pojo:实体类
service:业务层
Servlet:处理用户请求业务层(负责流程控制)
JSP Model2
JSP:负责生产动态网页
Servlet:负责流程控制
JavaBean:负责业务逻辑处理
浏览器(请求)——Servlet(控制器)——javabean——数据库——javabean——JSP——浏览器
视图:
解释模型
接收数据更新请求
发送用户输入给控制器
允许控制器选择视图
控制器:
接收用户请求
调用模型响应用户请求
选择视图显示响应结果
模型:
封装应用程序状态
响应状态查询
处理业务流程
通知视图业务状态更新
MVC优点
多视图共享一个模型,大大提高代码的可重用性
MVC三个模块相互独立,松耦合架构
控制器提供了应用程序的灵活性和可配置性
有利于软件工程化管理
完美的系统架构=松耦合+高重用性+高扩展性
MVC缺点:
原理复杂
增加了系统结构和实现的复杂性
视图对模型数据低效率访问
(不适合小型或中型项目)
Spring MVC环境的搭建(用于web项目开发的架构)
结构最清晰的MVC Model2实现
Controller:代替了servlet
ModeAndView
Actor——Controller——model——Controller——view
SpringMVC框架搭建步骤
1、下载jar文件并导入工程
spring-web-3.2.13.RELEASE.jar
spring-webmvc-3.2.13.RELEASE.jar
2、配置文件
在web.xml中配置servlet
创建Spring MVC的配置
3、创建Controller处理请求控制器
BeanNameUrlHandlerMapping
4、创建View-Jsp
5、部署运行
web.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 核心控制器配置DispatchServlet -->
<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:springmvc-servlet.xml</param-value>
</init-param>
<!-- 启动容器时加载DispatcherServlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
springMVC配置文件
<?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.xsd">
<!-- 配置处理器映射,HandlerMapping -->
<!-- 访问index.html路径,它是名义上的路径,其实是交到IndexController这个类中去处理,代替了原先servlet这个类要继承AbstractController类 -->
<bean name="/index.html" class="cn.smbms.controller.IndexController"/>
<!-- 配置视图解析器 /WEB-INF/jsp/index.jsp-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--/WEB-INF/jsp/访问的前缀 -->
<property name="prefix" value="/WEB-INF/jsp/"></property>
<!-- .jsp访问的后缀 ModelAndView("index");这个是index限定名,也是拼接成/WEB-INF/jsp/index.jsp完整访问路径-->
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
package cn.smbms.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
public class IndexController extends AbstractController{
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest arg0,
HttpServletResponse arg1) throws Exception {
System.out.println("hello,spring mvc!");
return new ModelAndView("index");
}
}
若有多个请求时,需要配置多个映射关系,并建立多个Controller,这样很繁琐。
基于注解的处理器
<mvc:annotation-driven/>
DefaultAnnotationHandlerMapping
AnnotationMethodHandlerAdapter
<context:component-scan />
@Controller
@RequestMapping
springmvc-servlet.xml
<!-- 使用注解实现Controller -->
<mvc:annotation-driven />
<!-- 启动注解器 -->
<context:component-scan base-package="cn.smbms.controller" />
@Controller
public class IndexController{
//index访问的url
@Controller
public class IndexController{
//index访问的url
@RequestMapping("/index")
protected ModelAndView index(){
System.out.println("注解实现SpringMvc");
//"index"是逻辑视图返回值
return new ModelAndView("index");
}
}
DispatcherServlet(前端控制器)
Spring MVC最核心的类
web.xml中配置
Handler(处理器):对应MVC中的C(Controller层)
类型:Object
作用:实际处理请求
标注了@RequestMapping的方法都可以看作是一个Handler
ModelAndView
逻辑视图名
模型对象
核心组件
HandlerMapping(处理映射)
BeanNameUrlHandlerMapping(默认)
将请求URL映射到同名的控制器Bean上
DefaultAnnotationHandlerMapping
将请求映射标注了@RequestMapping的方法都可以看作是一个Handler
HandlerAdapter(适配器)
AnnotationMethodHandlerAdapter
RequestMappingHandlerAdapter
ViewResolver(视图解析器)
InternalResourceViewResolver
SpringMVC框架特点
清晰地角色划分
灵活配置功能
提供了大量的控制器接口和实现
真正做到与View层的实现无关(JSP/Velocity/Xslt等)
国际化支持
面向接口编程
Spring提供了Web应用开发的一整套流程,不仅仅是MVC,他们之间可以很方便的结合一起
参数的传递与视图解析器
参数传递(View to Controller)
参数传递(Controller to View)
视图解析器(InternalResourceViewResolver)
@RequestMapping参数传递
标注在方法定义处
@RequestMapping("/welcome")
protected String welcome(@RequestParam String username){
System.out.println("注解实现SpringMvc"+username);
//"index"是逻辑视图名
return "index";
}@RequestParam参数传递
访问url:http://localhost:8085/SMBMS-MVC/welcome?username=lazy
标注在类定义处
@Controller
@RequestMapping("/lazy")相当于一个根目录
public class IndexController{
//index访问的url
@RequestMapping("/index")
protected ModelAndView index(){
System.out.println("注解实现SpringMvc");
//"index"是逻辑视图返回值
return new ModelAndView("index");
}
//index访问的url会跳转到/WEB-INF/jsp/文件下的index.jsp页面上
@RequestMapping("/welcome")
protected String welcome(@RequestParam String username){
System.out.println("注解实现SpringMvc"+username);
//"index"是逻辑视图返回值
return "index";
}
}访问的url:http://localhost:8085/SMBMS-MVC/lazy/welcome?username=lazy
映射规则
通过请求URL进行映射
通过请求参数进行映射
若选择方法参数直接入参的话,方法入参必须与请求参数名保持一致
通过请求方法进行映射
GET
POST
@RequestParam
value
required 默认true,是否必须请求是否有参数
defaultValue
@RequestParam(value="username",required=false)
如何将模型数据传递给视图
ModelAndView
包含视图信息和模型数据信息
常用方法
添加模型数据
ModelAndView addObject(String attirbuteName,Object attributeValue);
ModelAndView addAllObjects(Map<String,?> modelMap);
设置视图
void setView(View view)
void setViewName(String viewName);
@RequestMapping("/index1")
protected ModelAndView index1(String username){
ModelAndView mView = new ModelAndView();
mView.addObject("username", username);
mView.setViewName("index");
//"index"是逻辑视图返回值
return mView;
}
将数据传到index.jsp页面上
<body>
Hello Spring MVC. <br>
<h1>username------------>${username}</h1>
</body>
使用Model给视图传递数据,一般推荐使用model传递数据。
Model
数据结构:Map类型
常用方法:添加模型数据
Model.addAttribute(String attirbuteName,Object attributeValue)
处理方法的入参为Model类型,
@RequestMapping("/index2")
protected String index2(String username,Model model){
model.addAttribute("username", username);
//"index"是逻辑视图返回值
return "index";
}
使用map给视图传递数据
@RequestMapping("/index3")
protected String index2(String username,Map<String,Object> model){
model.put("username", username);
//"index"是逻辑视图返回值
return "index";
}
视图解析器-ViewResolver
将逻辑视图名与JSP等视图技术进行匹配
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--/WEB-INF/jsp/访问的前缀 -->
<property name="prefix" value="/WEB-INF/jsp/"></property>
<!-- .jsp访问的后缀 ModelAndView("index");这个是index限定名,也是拼接成/WEB-INF/jsp/index.jsp完整访问路径-->
<property name="suffix" value=".jsp"></property>
</bean>
/WEB-INF/jsp/index.jsp 其中index 是逻辑视图名
InternalResourceViewResolver主要用于JSP页面的视图
以上是关于java框架5-Spring MVC的主要内容,如果未能解决你的问题,请参考以下文章
SSM 三大框架系列:Spring 5 + Spring MVC 5 + MyBatis 3.5 整合(附源码)