springmvc:是一个轻量级的,基于请求响应的mvc框架。
实例类:
package com.tedu.pojo; public class User { private String name; private Integer age; private String addr; public User() { } public User(String name, Integer age, String addr) { this.name = name; this.age = age; this.addr = addr; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getAddr() { return addr; } public void setAddr(String addr) { this.addr = addr; } @Override public String toString() { return "User [name=" + name + ", age=" + age + ", addr=" + addr + "]"; } }
springmvc-config.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:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- 1.配置前端控制器放行静态资源(html/css/js等,否则静态资源将无法访问) --> <mvc:default-servlet-handler/> <!-- 2.配置注解驱动,用于识别注解(比如@Controller) --> <mvc:annotation-driven></mvc:annotation-driven> <!-- 3.配置需要扫描的包:spring自动去扫描 base-package 下的类, 如果扫描到的类上有 @Controller、@Service、@Component等注解, 将会自动将类注册为bean --> <context:component-scan base-package="com.tedu.controller"></context:component-scan> <!-- 4.配置内部资源视图解析器 prefix:配置路径前缀 suffix:配置文件后缀 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/pages/"/> <property name="suffix" value=".jsp"/> </bean> </beans>
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <display-name>day16-springmvc</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <!--配置springmvc的前端控制器(DispatherServlet) --> <servlet > <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 配置springmvc核心配置文件的位置 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-config.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <!--拦截除了jsp以外的其他请求 --> <url-pattern>/</url-pattern> </servlet-mapping> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
测试类:
package com.tedu.controller; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.ServletRequestDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.tedu.pojo.User; @Controller public class HelloController { //http://localhost:8080/day16-springmvc/hello @RequestMapping("/hello") public String hello() { System.out.println("hello springmvc..."); return "home"; } /*1.springmvc参数绑定 * 基本数据类型绑定 * * */ @RequestMapping("/testParam1") public String testParam1(String name, Integer age, String addr) { System.out.println("HelloController.testParam1"); System.out.println("name="+name); System.out.println("age="+age); System.out.println("addr="+addr); return "home"; } @RequestMapping("/testParam2") public String testParam2(User user) { System.out.println(user); return "home"; } @RequestMapping("/testparam3") public String param3(Date date){ System.out.println("date="+date.toLocaleString()); return "home"; } /* 自定义日期转换格式 */ @InitBinder public void InitBinder (ServletRequestDataBinder binder){ binder.registerCustomEditor(java.util.Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"), true) ); } /* 测试请求转发(forward) */ @RequestMapping("/testForward") public String testForward() { System.out.println("HelloController.testForward()"); return "forward:/hello"; } /* 测试请求重定向(Readirect) */ @RequestMapping("/testRedirect") public String testRedirect() { System.out.println("HelloController.testRedirect()"); return "redirect:/hello"; } /* 测试Post提交的中文参数是否存在乱码问题 */ /* 测试请求重定向(Readirect) */ @RequestMapping("/testGet") public String testGet(String username, String[] like) { System.out.println(username); System.out.println(Arrays.toString(like)); return "home"; } @RequestMapping("/testPost") public String testPost(String username, String[] like) { System.out.println(username); System.out.println(Arrays.toString(like)); return "home"; } /*响应数据(Model和JSON)*/ /**当浏览器访问/testModel时, * 在方法中获取到的User对象转发带到home.jsp,在JSP中取出并显示 * */ @RequestMapping("/testModel") public String testModel(Model model) { User user = new User(小明",30,"泰国"); User user1 = new User("小亮",30,"泰国"); List<User> list = new ArrayList<>(); list.add(user); list.add(user1); model.addAttribute("user", user); return "home"; } @RequestMapping("/testModel2") public String testModel2(Model mode2) { User user = new User("小明",30,"泰国"); User user1 = new User("小亮",30,"日本"); List<User> list = new ArrayList<>(); list.add(user); list.add(user1); mode2.addAttribute("list", list); return "home"; } /*测试响应数据JSON1*/ @RequestMapping("/testJSON1") @ResponseBody public User testJSON1() { User user = new User("小王",30,"泰国"); return user; } /*测试响应数据JSON2*/ @RequestMapping("/testJSON2") @ResponseBody public List<User> testJSON2() { List<User> list = new ArrayList<>(); list.add(new User("小明",30,"美国国")); list.add(new User("小王",30,"泰国")); list.add(new User("小狼",30,"日本")); return list; } }
jsp页面
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1>hello springmvc~~~</h1> <hr/> ${user.name} ${user.age} ${user.addr} <hr/> <c:forEach items="${list}" var="user"> ${user.name}:${user.age}:${user.addr}<br/> </c:forEach> </body> </html>
通用页面跳转
/* 通用的页面跳转方法*/ @RequestMapping("/{pageName}") public String toPage(@PathVariable String pageName) { return pageName; }
mvc设计模式
MVC设计模式是一种通用的软件编程思想
在MVC设计模式中认为, 任何软件都可以分为三部分组成:
(1)控制程序流转的控制器(Controller)
(2)封装数据处理数据的模型(Model)
(3)负责展示数据的视图(view)
并且在MVC设计思想中要求一个符合MVC设计思想的软件应该保证上面这三部分相互独立,互不干扰,每一个部分只负责自己擅长的部分。
如果某一个模块发生变化,应该尽量做到不影响其他两个模块。这样做的好处是,软件的结构会变得更加的清晰,可读性强。有利于后期的扩展和维,并且代码可以实现复用。
springmvc的核心组件:
前端控制器DispatcherServlet
作用:接收请求,响应结果,相当于转发器,中央处理器。有了dispatcherServlet减少了其它组件之间的耦合度。
处理器映射器HandlerMapping
作用:根据请求的url查找Handler
HandlerMapping负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
处理器适配器HandlerAdapter
作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
处理器Handler
Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
由于Handler涉及到具体的用户业务请求,所以一般情况需要工程师根据业务需求开发Handler。
作用:负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,
第一步:发起请求到前端控制器(DispatcherServlet)
第二步:前端控制器请求HandlerMapping查找Handler可以根据xml配置、注解进行查找
第三步:处理器映射器HandlerMapping向前端控制器返回Handler
第四步:前端控制器调用处理器适配器去执行Handler
第五步:处理器适配器去执行Handler
第六步:Handler执行完成给适配器返回ModelAndView
第七步:处理器适配器向前端控制器返回ModelAndView。ModelAndView是springmvc框架的一个底层对象,包括 Model和view
第八步:前端控制器请求视图解析器去进行视图解析,根据逻辑视图名解析成真正的视图(jsp)
第九步:视图解析器向前端控制器返回View
第十步:前端控制器进行视图渲染。视图渲染将模型数据(在ModelAndView对象中)填充到request域
第十一步:前端控制器向用户响应结果