JavaEE Day07 SpringMVC
Day07 SpringMVC
什么是MVC
- m:model 模型(处理业务)
- V:view 视图(展示)
- C:controller 控制器(控制,调配)
![-w430]()
什么是springMVC
表示层的MVC框架,是Spring的子框架
springMVC的运行原理

入门案例
创建web项目,导入jar(在WebContent(web)/WEB-INF/lib下.
- 4+1(Spring 基本框架(core,beans,context,expression) + Mybatis中的commons-logging-1.2.jar 包)
- spring-webmvc.jar
- Spring-web.jar
配置servlet
在web.xml中,新建servlet的配置:
- 前端控制器的class
- 匹配的url
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<display-name>springmvc_01</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>
<!-- 默认配置文件的加载路径: /WEB-INF/mvc-servlet.xml
指定配置文件加载路径:contextConfigLocation
-->
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
新建主页面
创建一个index.jsp,
使用a标签跳转到SpringMVC的后端处理器,通过url映射机制跳转到某个后端处理器上;
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="hello.do">点我</a>
</body>
</html>
新建后端控制器
- 在controller包中,新建后端控制器,实现控制器(controller)并覆写handlerrequest接口
- 新建ModelAndView对象,并向域中添加需要展示的数据
mv.addObject(name值, 数据.; - 然后设置view的名称,该名称一个jsp文件的名称(展示页面,在jsp页面中使用${name值 } 调用)
package controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
/**
* 后端控制器(处理器)
* @author Administrator
*
*/
public class HelloController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response. throws Exception {
// TODO Auto-generated method stub
ModelAndView mv = new ModelAndView(.;
// 设置数据
mv.addObject("msg", "hello SpringMVC".;
// 设置视图信息
mv.setViewName("show".;
System.out.println("接收到dao".;
return mv;
}
}
新建SpringMVC 配置
- 配置处理器映射器
- 配置处理器适配器
- 创建处理器对象,也就是后端处理器,并与url进行映射,
- 新建视图解析器,分为前缀和后缀,访问路径 = 前缀+后端处理器的返回值+后缀;
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 1.处理器映射器 请求和处理器映射关系
请求路径和处理器对象的name属性值一样则映射成功
-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!-- 2.处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!-- 3. 创建处理器对象 -->
<bean name="/hello.do" class="controller.HelloController"></bean>
<!-- 4.视图解析器(根据视图名称找到物理视图) show /show.jsp -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
新建展示页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
${msg }
</body>
</html>
运行即可
注解实现springMVC
创建web项目,导入jar包
- 4+1,Spring-web.jar,Spring-webmvc.jar
- jackson-all-2.8.0.jar :支持json数据的操作
- Spring-aop.jar
新建servlet
在web.xml中,新建servlet的配置:
- 前端控制器的class
- 匹配的url
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>springmvc_02</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>
<!-- 默认配置文件的加载路径: /WEB-INF/mvc-servlet.xml
指定配置文件加载路径:contextConfigLocation
-->
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC2.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
新建主页
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="login.do" method="post">
用户名:<input type="text" name="username" />
密码:<input type="password" name="password" />
爱好:<input type="text" name="hb[0]">
<input type="text" name="hb[1]">
<input type="text" name="hb[2]">
<input type="text" name="hb[3]">
<input type="submit" value="登陆">
</form>
</body>
</html>
新建pojo的实体类
List属性 用来保存页面中的列表
package pojo;
import java.util.List;
public class User {
private String username;
private String password;
private List hb;
public List getHb(. {
return hb;
}
public void setHb(List hb. {
this.hb = hb;
}
public String getUsername(. {
return username;
}
public void setUsername(String username. {
this.username = username;
}
public String getPassword(. {
return password;
}
public void setPassword(String password. {
this.password = password;
}
@Override
public String toString(. {
return "User [username=" + username + ", password=" + password + ", hb=" + hb + "]";
}
}
新建后端处理器
- 在类上使用Controller注解
- 在方法上使用RequestMapping, value表示匹配的url,也就是说请求这个url的数据都交给这个方法来处理
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import pojo.User;
/**
* 处理所有user相关的请求
* @author Administrator
*
*/
@Controller
public class UserController {
/*// 处理用户登录请求(返回值是代表视图名称)
@RequestMapping("/login.do".
public String login(String username,String password.{
System.out.println(username+":"+password.;
return "show";
}*/
/*// 封装对象
@RequestMapping("/login.do".
public String login(User user.{
System.out.println(user.;
return "show";
}*/
@RequestMapping("/login.do".
public String login(User user,Model model.{
System.out.println(user.;
model.addAttribute("user", user.;
return "show";
}
@RequestMapping("/first.do".
public String first(Model model.{
System.out.println("first".;
model.addAttribute("msg","first".;
// 转发
// return "forward:second.do";
// 重定向
return "redirect:second.do";
}
@RequestMapping("/second.do".
public String second(.{
System.out.println("second".;
return "show";
}
}
新建SpringMVC配置
- 在src目录下
- 创建和管理controller(后端管理器)
- 自动创建 处理器映射和处理器适配器
- 配置视图解析器
<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 1. 创建和管理controller -->
<context:component-scan base-package="controller"></context:component-scan>
<!-- 2. 处理器映射和处理器适配器 -->
<mvc:annotation-driven />
<!-- 3.视图解析器(根据视图名称找到物理视图) show /show.jsp -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
乱码问题解决
- get请求,默认都是utf-8;不需要设置;
- post请求,需要在全局的filter中配置,设置编码格式,并匹配所有的访问;
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>springmvc_02</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>
<!-- 过滤器 -->
<filter>
<filter-name>charsetFilter</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>charsetFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 默认配置文件的加载路径: /WEB-INF/mvc-servlet.xml
指定配置文件加载路径:contextConfigLocation
-->
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC2.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
展示页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
${msg }
${user }
</body>
</html>
运行即可
参数封装和回显
- 简单类型:请求参数的name值和方法参数名称一致,
- 对象类型:请求参数的name值和类的属性一致
- 数组类型:name值和数组名称一致
- List/map类型:必须作为对象的属性才能封装,也就是要封装到某个特定对象的属性中;
也就是上面例子中User类的List属性;才能刚保存checkbox的值
转发和重定向
在后端处理器类的方法中,return 后面的字符串改为以下:
- 转发:
"forward:请求路径" - 转发:
"redirect:·请求路径"
参照上面的案例
整合案例 SSM
框架
- 表示层:SpringMVC
- 业务逻辑层:spring
- 数据持久层:mybatis
查询book数据并展示
- Mybatis
- Pojo
- Mapper
- spring和mybatis整合
- 配置mybatis文件加载,ssf,sqlsession,mapper对象创建和管理
- 事务管理和数据源
- service代码
- springMVC
步骤:
创建web项目,导入jar包:
- Mybatis:
- Mybatis.jar
- Mysql.jar
- Mybatis-spring.jar
- Spring:
- 4+1,
- Spring-aop
- Spring-aspects.jar
- Aopallian.jar
- Aspectjweaver.jar
- Spring-jdbc.jar
- spring-tx.jar Spring事务的jar包
- Spring-test.jar
- Spring-orm.jar
- springMVC:
- Spring-web.jar
- Spring-webmvc.jar
- Jackson.jar 注解需要,
- Jstl.jar 标签
新建配置文件目录
此目录必须是源码目录,所有的xml配置文件都放在此处
将java.properties和log4j.properties拷贝进来
java.properties
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql:///bd1808?useSSL=true
db.username=root
db.password=root
log4j.properties
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
分包
- controller
- service
- impl
- mapper
- pojo
配置mybatis
创建pojo实体类
package pojo;
import java.math.BigDecimal;
public class Book {
private int bid;
private String bname;
private String author;
private BigDecimal price;
public int getBid() {
return bid;
}
public void setBid(int bid) {
this.bid = bid;
}
public String getBname() {
return bname;
}
public void setBname(String bname) {
this.bname = bname;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
@Override
public String toString() {
return "Book [bid=" + bid + ", bname=" + bname + ", author=" + author + ", price=" + price + "]";
}
}
创建mapper映射接口
使用注解的方式;直接使用sql语句;
package mapper;
import java.util.List;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import pojo.Book;
public interface BookMapper {
@Select("select * from book")
List<Book> queryAll();
}
配置mybatis的mybatis.xml
配置别名
配置映射配置
其他配置交给spring
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- <properties resource="jdbc.properties"></properties> -->
<!-- <environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments> -->
<typeAliases>
<package name="pojo"/>
</typeAliases>
<mappers>
<package name="mapper"/>
</mappers>
</configuration>
创建servcie的接口 和实现类
接口
package service;
import java.util.List;
import pojo.Book;
public interface BookService {
List<Book> queryAll();
}
实现类
package service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import mapper.BookMapper;
import pojo.Book;
import service.BookService;
@Service("bookservice")
public class BookServiceImpl implements BookService {
@Autowired
private BookMapper mapper;
@Override
public List<Book> queryAll() {
// TODO Auto-generated method stub
return mapper.queryAll();
}
}
创建applicationContext.xml
- 将数据源交给spring
- ssf创建交给spring
- 创建和管理mapper对象
- 事务管理交给spring(声明式事务)
- 创建事务管理器
- 配置事务的策略
- Find和query read-only
- 增删改 propargation="Required"
- 织入事务
<?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:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<context:component-scan base-package="service"></context:component-scan>
<!-- 1.数据源管理给交spring -->
<!-- 本地路径 前面要加classpath -->
<context:property-placeholder location="classpath:java.properties"/>
<bean id="ds" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${db.driver}"></property>
<property name="url" value="${db.url}"></property>
<property name="username" value="${db.username}"></property>
<property name="password" value="${db.password}"></property>
</bean>
<!-- 2.ssf创建交给spring -->
<bean id="ssf" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:mybatis.xml"></property>
<property name="dataSource" ref="ds"></property>
</bean>
<!-- 3.创建和管理mapper对象 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="ssf"></property>
<property name="basePackage" value="mapper"></property>
</bean>
<!-- 4. 事务管理交给spring(声明式事务) -->
<!-- 4.1 创建事务管理器 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="ds"></property>
</bean>
<!-- 4.2 配置事务的策略 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="query*" read-only="true"/>
<tx:method name="find*" read-only="true"/>
<tx:method name="insert*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!-- 4.3 织入事务 -->
<aop:config>
<aop:pointcut expression="execution(* service..*(..))" id="myPointcut"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut"/>
</aop:config>
</beans>
配置web.xml
- 前端控制器
- (最后在看此处)配置监听器,监听application域的创建,一旦创建,就加载spring的ioc框架,也就是service;
- 配置spring ioc框架的配置文件位置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>ssm</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>
<!-- 加载 Spring ioc的配置-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<!-- 项目加载时,加载applicationContext.xml 配置文件,获取Context对象并且放置在application域管理;
默认加载配置文件路径:/WEB-INF/applicationContext.xml
-->
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 1. 前端控制器 -->
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:SpringMVC.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
新建后端控制器
package controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import pojo.Book;
import service.BookService;
import java.util.List;
@Controller
public class BookController {
@Autowired
private BookService service;
@RequestMapping("/query.do")
public String queryAll(Model model){
List<Book> books = service.queryAll();
model.addAttribute("books",books);
return "show";
}
}
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: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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="controller"/>
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>



浙公网安备 33010602011771号