------ SpringMVC ------
(1).MVC简介
- M(Model)
* 模型负责业务逻辑,包含两层(业务数据、业务处理逻辑)
* entity dao service 都属于模型层。
- V(view)
* 视图层负责显示界面,用户交互(收集用户信息)。属于视图的组件是不包含业务逻辑和控制逻辑的jsp
- C(Controller)
* 控制器是模型层和视图层之间的桥梁,用于控制流程。(Servlet项目中的单一控制器)
(2).什么是 Spring web MVC
- Spring MVC 是 spring框架一个非常重要的功能模块,实现了MVC结构。
便于简单、快速开发MVC结构的web程序,SpringMVC提供了API封装了web开发常用的功能,简化了web过程。
(3).Spring Web MVC核心组件(API)
- DispatcherServlet (控制器,请求入口)
- HandlerMapping (控制器,请求派发)
- Controller (控制器,请求处理逻辑)
- ModelAndView (模型,封装业务处理结果和视图)
---
- ViewResolver (视图,视图显示处理器)
(4).基于xml配置的mvc应用(步骤)
1.创建web工程,导入Spring MVC 相关开发包。
2.在src下添加Spring的xml配置文件(名称可以自定义 spring-mvc.xml)
3.在web.xml中配置DispatcherServlet
4.创建类实现Controller接口(处理业务逻辑 返回ModelAndView对象)
创建jsp
5.spring-mvc.xml 配置映射关系
(5).Controller组件
- Controller组件负责执行具体的业务逻辑,可以调用Dao组件,编写实现Controller接口及约定的方法。
(6).ModelAndView组件
- Controller组件约定方法执行后会返回一个ModelAndView对象,该对象可以封装模型数据和视图响应信息
ModelAndView构造器:
// viewName 是jsp页面的名称
// modelAndView(String viewName,Map model)
ModelAndView(String viewName);
ModelAndView(String viewName,Map model)
(7).web.xml 通过过滤器解决乱码
<!-- 配置过滤器 (解决乱码)-->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
/*
1.测试
2.登录页面 获取页面登录信息
*/
// spring-mvc.xml
/*
1.维护映射关系(Controller)
2.组件对象
3.找到jsp文件路径
*/
<?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:context="http://www.springframework.org/schema/context"
xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:util="http://www.springframework.org/schema/util" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.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/util http://www.springframework.org/schema/util/spring-util-3.2.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
<!-- SimpleUrlHandlerMapping维护映射关系 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<!-- 配置组件 -->
<!-- 根据key值寻找组件(prop文本内容匹配bean的id) -->
<prop key="/hello.form">helloController</prop>
<prop key="/log.form">loginController</prop>
</props>
</property>
</bean>
<!-- 组件对象 -->
<bean id="helloController" class="com.controller.HelloController"/>
<bean id="loginController" class="com.controller.LoginController"/>
<!-- 定义ViewResolver组件 找到jsp文件路径-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--
prefix:路径前缀
suffix:路径后缀
-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
// web.xml
/*
1.配置spring-mvc.xml文件(servlet)
2.配置过滤器
*/
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
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_2_5.xsd">
<!-- 配置门户 -->
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
<!-- 配置过滤器 (解决乱码)-->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!-- 初始化编码 -->
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置spring-mvc.xml文件 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- spring-mvc.xml文件 指定环境配置位置(类路径) -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.form</url-pattern>
</servlet-mapping>
</web-app>
// HelloController
package com.controller;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import com.dao.Emp;
public class HelloController implements Controller {
/* handleRequest 主要功能功能:处理业务逻辑
*
*/
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
//测试
System.out.println("Hello Controller ......");
// 前台页面获取值
String name = request.getParameter("name");
// 创建对象
Emp emp = new Emp();
emp.setId(1);
emp.setName(name);
emp.setAddress("IGaming");
// 创建HashMap
Map map = new HashMap<String, Emp>();
map.put("e", emp);
// 重定向 ModelAndView
return new ModelAndView("index",map);
}
}
// 创建Eemp实体类
// LoginController
package com.controller;
import java.util.HashMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class LoginController implements Controller {
/*
1.获取信息
2.处理业务逻辑
3.封装业务处理结果和视图并返回到DispatcherServlet控制器请求入口。
*/
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
// 页面获取信息
String account = request.getParameter("account");
String pwd = request.getParameter("pwd");
// 创建HashMap
HashMap<String, String> map = new HashMap<String, String>();
// 把值存到map集合
map.put("account", account);
map.put("pwd", pwd);
// 封装业务处理结果和视图
return new ModelAndView("index",map);
}
}
(8).重定向
// 重定向到登录页面
RedirectView rv = new RedirectView("login.jsp");
return new ModelAndView(rv);
(9).基于注解配置的MVC应用
- @RequesMapping 注解应用
- @RequestMapping 可以在类定义的方法定义上
- @RequesMapping 表明这个类或者方法与哪一个客户请求对应
(10).请求页面参数值
- SpringMvc获取请求参数有如下几种方法:
* 用HttpServletRequest获取: request对象可以通过添加处理方法的参数获取
* 使用@RequesParam注解
* 使用自动机制封装成bean对象
(11).向页面传值
- 当Controller组件处理后,需要jsp传值时,
- 使用ModelMap参数对象
- 使用ModelMap参数对象
- 使用ModelAndView对象
(12).重定向视图
- 重定向方式可以采取以下几种方法:
* 使用RedirectView 适合返回类型: ModelAndView
return new ModelAndView();
* 使用redirect:前缀 适合返回类型:字符串类型
return "redirect:login.jsp";
包结构:
controller
dao
// spring-mvc.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:context="http://www.springframework.org/schema/context"
xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:util="http://www.springframework.org/schema/util" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.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/util http://www.springframework.org/schema/util/spring-util-3.2.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
<!-- 组件扫描 -->
<context:component-scan base-package="com"/>
<!-- 开启请求的注解扫描 -->
<mvc:annotation-driven/>
<!-- 定义ViewResolver组件 找到jsp文件路径-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
// HelloController
package com.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
//@RequestMapping("/test") // http://localhost:8080/SpringMvcComment/test/hello.form
public class HelloController {
@RequestMapping("/hello.form") // @RequesMapping 注解应用 与 hello.form响应
public String execute(){
System.out.println("**********");
return "index";
}
}
// LoginController
package com.controller;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import com.dao.User;
@Controller
public class LoginController {
/*
// 通过reques请求取值
@RequestMapping("/log.form")
public String execute(HttpServletRequest request){
// 从页面获取值
String acc = request.getParameter("account");
String pwd = request.getParameter("pwd");
// 测试
System.out.println(acc+"||"+pwd);
// 转发到index.jsp页面
return "index";
}
*/
/*
// 不通过request请求取值 (String account,String pwd) 对应login.jsp的name属性值
@RequestMapping("/log.form")
public String execute(String account,String pwd){
// 直接从页面得到值
System.out.println(account+"||"+pwd);
// 转发到index.jsp页面
return "index";
}
*/
/*
// 不同名如何取值? 通过注解@RequestParam("pwd")
@RequestMapping("/log.form")
public String execute(String account,@RequestParam("pwd") String password){
System.out.println(account + "||" + password);
return "index";
}
*/
/*
// 当需要取多个值的时候? 使用自动机制封装成bean对象
@RequestMapping("/log.form")
public String execute(User user){
System.out.println(user.getAccount()+"||"+user.getPwd());
return "index";
}
*/
/*
// 通过request页面传值
@RequestMapping("/log.form")
public String execute(User user,HttpServletRequest request){
// 通过request绑定数据
// request.setAttribute("user", user);
// 通过session绑定数据
HttpSession session = request.getSession();
session.setAttribute("u", user);
// return "index";
// 重定向
return "redirect:index.jsp";
}
*/
/*
// 使用ModelMap向页面传值
@RequestMapping("/log.form")
public String execute(String account,@RequestParam("pwd") String password,ModelMap map){
// 调用.addAttribute() 方法添加数据到ModelMap
map.addAttribute("acct", account);
map.addAttribute("pwd", password);
// 转发到index.jsp页面
return "index";
}
*/
/*
// 使用ModelAndView向页面传值
@RequestMapping("/log.form")
public ModelAndView execute(HttpServletRequest request){
// 获取请求资源路径
String path = request.getRequestURI();
System.out.println(path);
// 从页面获取值
String account = request.getParameter("account");
String pwd = request.getParameter("pwd");
// 创建HashMap存值(传值到页面)
Map<String, Object> map = new HashMap<String, Object>(); // <String,String>也可以
map.put("acct", account);
map.put("pwd", pwd);
// 重定向
return new ModelAndView("index",map);
}
*/
/*
@RequestMapping("/log.form")
public String execute(User user,ModelMap map){
map.addAttribute("acct", user.getAccount());
map.addAttribute("pwd", user.getPwd());
// 重定向
return "index";
}
*/
}
// jsp目录 index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>测试页面</title>
</head>
<body>
<!-- ***${user.account }***${user.pwd }*** -->
<!-- ***${u.account }***${u.pwd }*** -->
<!-- ***${acct }***${pwd }*** -->
***${acct}***${pwd }***
</body>
</html>
网友评论