SpringMVC
SpringMVC定义:
什么是SpringMVC定义:
什么是SpringMVC?
SpringMVC是一种基于Spring实现了web MVC设计模式的请求驱动类型的轻量级web框架,使用了MVC的架构模式思想,将web层进行解耦,并管理应用所需的生命周期,为简化日常开发,提供了很大的便利
== 说白一点;SpringMVC是用来替代servlet的!==
== 说白一点;SpringMVC是用来替代servlet的!==
扩展:
SpringMVC和Servlet的关系?
SpringMVC的DispatcherServlet继承自FramworkServlet继承自HttpServletBean继承自HttpServlet(servlet)本质上是同一个东西
好比说Mybatis是对JDBC的封装,SpringMVC是对servlet的封装
1、SpringMVC是Spring框架的一个模块,所以Spring去整合SpringMVC无需整合包
2、SprigMVC是一个基于MVC的web框架
3、SpringMVC表现层:方便前后端数据的传输
4、SpringMVC拥有控制器,作用跟Struct2类似,接受外部请求,解析参数传递给服务器,最后显示视图
优势:
1、清晰的角色划分
2、灵活的配置功能
3、提供了大量的控制器接口和实现类
4、正在做到与view层的实现无关(jsp、freemark、velvetoclty、bootstrap)
5、国际化支持
6、面向接口编程
7、SSM完美结合Spring+SpringMVC+mybatis
SpringMVC的运行过程:
1、用户发送请求到前端控制器(DispatcherServlet)
2、前端控制器请求HandlerMapping查找Handle,可以根据xml文件配置或者注解进行查找
3、处理器映射器HandleMapping向前端控制器返回Handler
4、前端控制器调用处理器适配器去执行Handler
5、Handler执行完给前端控制器返回ModleLandview
6、处理适配器配置给前端控制器返回Modelandview、ModelAndView是SpringMvC框架到一个底层对象,包括Model和view
7、 前端控制器请求视图解析器(viewResolver)去进行视图解析,根据逻辑视图名解析成真正的视图
8、前端控制器将模型数据(Model)和view渲染,通俗点讲就是将模型数据填充到视图层,向客户端响应结果展示view页面
入门:
1、导包
SpringMVC是Spring框架对Web的支持,所以包Spring下载的包里面就有,另外
Spring和SpringMVC集成的时候不需要加集成的包
2、配置web.xml
<?xml version="1.0" encoding="UTF-8"?> SpringMVCDay01_01 default.jsp Springmvc org.springframework.web.servlet.DispatcherServletcontextConfigLocation
classpath:springmvc-servlet.xml
1
Springmvc
/
3.配置springmvc-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>mvc:annotation-driven/
4.编写indexController.java
package com.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,SpringMVC”);
ModelAndView modelAndView = new ModelAndView(“index”);
return modelAndView;
}
//当客户端发送http://localhost:9090/项目名/ index.html请求的时候,执行handleRequestInternal()
//方法,进行控制层处理,并且最后要返回一个ModelAndView对象, DispatcherServlet前端控制器通过视图解析器把数据
//填充到index.jsp去展示
}
5.部署项目,运行
浏览器访问:
http://localhost:8081/SpringMVCDay01_01/index.html
注解方式简化配置:
1、springmvc-servlet.xml配置
<context:component-scan base-package=“com.controller”></context:component-scan>
mvc:annotation-driven</mvc:annotation-driven>
2.indexController.java
package com.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class IndexController {
@RequestMapping(“/index.html”)
public String index(){
System.out.println(“Hello,SpringMVC!”);
//返回逻辑视图名称index.jsp
return “index”;
}
}
F、参数传递
[view-controller]
视图层–控制层
package com.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class IndexController {
@RequestMapping(“/index.html”)
public String index(){
System.out.println(“Hello,SpringMVC!”);
//返回逻辑视图名称index.jsp
return “index”;
}
//方法1:
//@RequestMapping(“/welcome”)
//public String welcome(@RequestParam String username){
//System.out.println(“welcome,”+username);
返回逻辑视图名称index.jsp
//return “index”;
//
//}
/**
- 方式2:
- @param username
- @return
- value="username"代表参数名称
- required代表参数是否必须为默认为true
- defaultValue = "sa666"代表参数默认值
*/
方法2:
//@RequestMapping(value = “/welcome”)
//public String welcome(@RequestParam (value=“username”,required = false, defaultValue=“sa666” )String username){
//System.out.println(“welcome,”+username);
返回逻辑视图名称index.jsp
//return “index”;
//
//}
/**方式3
- 还可以设置请求get还是post请求
- @param username
- @return
*/
//方法3:
@RequestMapping(value = “/welcome”,method = RequestMethod.GET,params=“username”)
public String welcome(String username){
System.out.println(“welcome,”+username);
//返回逻辑视图名称index.jsp
return “index”;
}
}
@requestmapping(“”)不仅可以配置在方法上,也可以配置在类上,如果配置在类上代表这个类都要加上这个路径
package com.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
@RequestMapping(“/user”)
public class UserController {
//http://localhost:8081/SpringMVCDay01_01/welcome?username=sa123
//http://localhost:8081/SpringMVCDay01_01/welcome?username=sa123
//{“/welcome”,“/”}代表可以配置多个请求路径,共同访问welcome方法
@RequestMapping({“/welcome”,“/”})
public String welcome(@RequestParam(value = “username”)String username){
System.out.println(“welcome,username:”+username);
return “index”;
}
}
[controller-view]
控制层–试图层
1.Model
model作用
package com.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import com.pojo.User;
@Controller
public class IndexController {
/**
- 参数传递:controller—>view
- model作用:往前台传数据,可以传任意类型,比如对象 list等 通过EL表达式${获取}
- 其实Model装到了request域
- @param username
- @param model
- @return
*/
@RequestMapping(“/index.html”)
public String index(String username,Model model){
System.out.println(“Hello,SpringMVC!username:”+username);
//返回逻辑视图名称index.jsp
model.addAttribute(“username”, username);
User user = new User();
user.setUserName(username);
//没有键?键默认是这个对象的类型User
model.addAttribute(user);
model.addAttribute(“currentUser”, user);
return “index”;
}
}
2.index.jsp
<%@ page language=“java” contentType=“text/html; charset=ISO-8859-1”
pageEncoding=“utf-8”%>
Hello,${user.userName}
Hello,${currentUser.userName}
2.ModelandView
包含视图信息和模型数据信息
package com.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import com.pojo.User;
@Controller
public class IndexController {
/**
- 参数传递:controller—>view
- model作用:往前台传数据,可以传任意类型,比如对象 list等 通过EL表达式${获取}
- 其实Model装到了request域
- @param username
- @param model
- @return
*/
@RequestMapping(“/index.html”)
public String index(String username,Model model){
System.out.println(“Hello,SpringMVC!username:”+username);
//返回逻辑视图名称index.jsp
model.addAttribute(“username”, username);
User user = new User();
user.setUserName(username);
//没有键?键默认是这个对象的类型User
model.addAttribute(user);
model.addAttribute(“currentUser”, user);
return “index”;
}
/**
- ModelAndView
- @param username
- @param model
- @return
*/
@RequestMapping(“/index2.html”)
public ModelAndView index2(String username,Model model){
System.out.println(“Hello,SpringMVC!username:”+username);
//ModelAndView mView =new ModelAndView(“index”);
ModelAndView mView =new ModelAndView();
mView.setViewName(“index”);
mView.addObject(“username”, username);
return mView;
}
//转发和重定向
@RequestMapping(“/index3.html”)
public ModelAndView index3(String username,Model model){
System.out.println(“Hello,SpringMVC!username:”+username);
//转发:默认就是转发!
//重定向到index2这个页面
ModelAndView mView =new ModelAndView(“redirect:index2”);
//重定向到dao层controller
mView.addObject(“username”, username);
return mView;
}
}
3.Map类型Model
@RequestMapping(“/index4.html”)
public String index4(String username,Map<String,Object> model){
System.out.println(“Hello,SpringMVC!username:”+username);
model.put(“username”, username);
return “index4”;
}