SpringMVC介绍
- Strut2缺点
1) 效率低
2) 标签库非常丰富,但业界使用的并不多,业界使用JSTL(通用)
Jsp/servlet/struts1/struts2/springmvc
- SpringMVC工作原理
- 体验springmvc
开发步骤:
1、 创建一个工程
2、 导入jar
spring-aop-3.2.2.jar AOP
spring-aspects-3.2.2.jar 面向切面
spring-beans-3.2.2.jar 核心包
spring-context-3.2.2.jar 扩展包
spring-context-support-3.2.2.jar 对扩展包支持
spring-core-3.2.2.jar 核心包
spring-expression-3.2.2.jar spring表达式
spring-web-3.2.2.jar b/s
spring-webmvc-3.2.2.jar springmvc
com.springsource.org.aopalliance-1.0.0.jar aop
com.springsource.org.apache.commons.logging-1.1.1.jar 通用日志
3、 需求:http://localhost/springmvc/home.action
最终要转向一个jsp页面 /WEB-INF/pages/index.jsp
4、 配置DispatcherServlet,在web.xml中配置
<?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">
<!-- 配置springmvc核心分发器,对所有的url后缀为action的进行过滤 -->
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
l Springmvc 什么时间加载的?
它不随容器启动而启动,它是第一次访问时进行加载。
l 改动springmvc的配置文件的位置
改到classpath下
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 改变springmvc配置文件的位置和名称 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
</servlet>
5、 配置Controller
handlerMapping默认BeanName方式
<bean name="/home.action" class="cn.itcast.controller.HomeController"/>
6、 写jsp页面 在WEB/INF/pages/index.jsp
7、 配置转向jsp
1) 在Controller处理完返回一个逻辑名 new ModelAndView(“逻辑名”)
2) 在springmvc-servlet.xml中配置Jsp视图解析器,内部资源视图解析器
<!-- 配置视图jsp解析器
内部资源视图解析器 前缀+逻辑名+后缀 /WEB-INF/pages/ index .jsp -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
了解常用的handlerMapping
1) BeanNameUrlHandlerMapping
<bean
id="beanNameUrlHandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
找寻配置的Controller,搜索器name属性,找到则转向jsp
2) SimpleUrlHandlerMapping
前提controller要声明id属性
<bean id="homeController" name="/home.action" class="cn.itcast.controller.HomeController"/>
<bean
id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/a.action">homeController</prop>
<prop key="/b.action">homeController</prop>
<prop key="/c.action">homeController</prop>
</props>
</property>
</bean>
当有beanName方式和simple方式它们声明冲突时,也就是同名url。这时springmvc框架如何处理?
l 首先配置重名不会引起冲突。
l 当同名时,springmvc框架先按配置文件配置的顺序执行,当发现有一个URL满足,就跳出。
支持用户自定义顺序。增加order属性即可。
<proprety name=”order” value=”n”/> n是一个整数,从0开始,越小优先级越高
3) ControllerClassName 控制器类名
<bean
id="controllerClassNameHandlerMapping" class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
访问链接:
http://localhost/springmvc/homeController.action
链接有多个单词时,都小写。
也可以去掉Controller
- 常见的Contoller控制器
1) Command命令控制器
规定:传参,command,对应实体
在构造方法中要指定command对应实体
public MyCommandController() {
this.setCommandClass(Person.class);
}
2) 简单的Form控制器
规定:链接以get方式提交时转向formView;链接以post方式提交转向successView
<bean class="cn.itcast.controller.PersonFormController">
<property name="formView" value="PersonForm"/> <!-- 转向的form视图 -->
<property name="successView" value="index"/> <!-- 成功视图 -->
</bean>
3) Wizard控制器
需求:个人简历,包括:简历信息、教育经历、工作经历
1) 继承 extends AbstractWizardFormController
2) 构造方法时设置关联的实体
public MyWizardController() {
this.setCommandClass(Person.class);
this.setCommandName("p"); //设置页面访问的对象
}
3) 设置processFinish成功完成要处理的事情;设置processCancel取消转向页面
4) 做多个页面
5) 配置页面和顺序
<bean class="cn.itcast.controller.MyWizardController">
<!-- 配置这个向导有哪些页面和页面的流转顺序 -->
<property name="pages">
<list>
<value>wizard/PersonInfo</value>
<value>wizard/PersonEdu</value>
<value>wizard/PersonWork</value>
</list>
</property>
</bean>
- 注解方式开发
1) 开发步骤:
1、 新建项目
2、 导入jar包
3、 创建controller,用注解方式声明
4、 在web.xml配置核心分发器DispatcherServlet
5、 创建一个springmvc-servlet.xml,只配置注解开发方式,配置视图解析器
6、 创建jsp
2) 需求:人员的管理,CRUD
1、 内存数据库,模拟一个service层
2、 初始化数据,10条,模拟列表页面
3、 将数据传递给页面,(集合)
4、 新增从页面获取数据,Model
3) 注意:新增保存如何传参
public String saveOrUpdate(String name, Integer age){
参数只要在方法中声明,springmvc框架会自动从页面中找寻对应变量,找寻变量的set方法,找到就设置,找不到抛弃。
l 方法一,按字段从页面取值
@RequestMapping("/person/saveOrUpdate")
public String saveOrUpdate(String name, Integer age){
Person p = new Person();
p.setName(name);
p.setAge(age);
ps.insert(p); //调用servcie.insert方法插入记录
return "redirect:/person/all.action"; //转向列表action
}
l 方法二,传实体对象
@RequestMapping("/person/saveOrUpdate")
public String saveOrUpdate(Person p){ //可以传递字段,也可以传递实体对象
ps.insert(p); //调用servcie.insert方法插入记录
return "redirect:/person/all.action"; //转向列表action
}
修改方法:
4) 删除方法
封装到数组,但名称不同,页面一个名称,声明的属性另外一个名称
public String deleteMuch(@RequestParam("id")Integer[] ids){
当封装多个同名值时,springmvc如何封装?
1) 当类型为string,多个值以逗号隔开,
2) 当类型为integer或者double,date等只留第一个值;不会抛出错误。、
5) 传参总结
1) 从页面传递参数到action
Struts2 Model
Springmvc 可以通过单个属性,也可以通过实体对象
2) 从action传递参数到页面
Struts2 Model
Springmvc Model(Map)
- 图片上传
1) 改造form enctype=”multipart/form-data” ;使用springmvc提供标签
2) 在后台接收参数二进制流
3) 配置单独的文件上传视图解析器
修改修改页面,先让数据回显,使用springmvc提供的标签
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf" %>
<sf:form
action="${pageContext.request.contextPath}/person/saveOrUpdate.action" method="post">
<sf:hidden path="id"/>
<sf:input path="name"/>
- 注意修改时接收对象参数:
<sf:form
enctype="multipart/form-data"
action="${pageContext.request.contextPath}/person/saveOrUpdate.action"
modelAttribute="p"
method="post">model.addAttribute("p", p); //数据放到response
modelAttribute接收设置在Model中的对象
- 图片显示
默认只扫描.action结尾
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
扫描所有URL
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<mvc:resources location="/upload/" mapping="/upload/**"/>
- 文件上传需要一个视图解析器
<!-- 文件上传视图解析器,它的名字必须为multipartResolver -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760"/><!-- 10M -->
</bean>
还需要两个jar
commons-fileupload-1.2.2.jar
commons-io-2.0.1.jar
- 框架中动态资源和静态资源分别解析
Apache + tomcats(集群)
Apache负责负载均衡,同时它来解析静态资源(js,css,image),tomcat做动态资源解析(jsp,action) 静态内容处理比动态快很多倍。
Nginx + tomcats
它的速度是apache的100倍。
- 校验JSR303 hibernate
com.springsource.javax.validation-1.0.0.GA.jar 校验规则
hibernate-validator-4.1.0.Final.jar hibernate实现
log4j.jar
slf4j-api-1.5.8.jar
slf4j-log4j12.jar
后台校验步骤:
1) 在实体上配置要校验的属性
public class Person {
private Integer id;
@Size(min=6,max=30,message="用户名称必须大于6个字符,小于30个字符。")
private String name;
2)是否启用校验
@Valid Person p
3) 发生错误,在页面上提示
BindingResult br 传递错误信息
4) 在新增页面中加错误提示