SpringMVC
load-on-startup
在web.xml中不加这个属性时 或当里面的值小于0 或者没有指定时
Spring容器是不会随着程序的启动而加载的 只有当具体访问的时候才会加载Spring容器
当在web.xml中加上这个属性时 值是整数且大于0 Spring容器会随着程序的启动而加载
web.xml中
<servlet>
<servlet-name>Spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Spring</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
varStatus
js中forEach循环标签中 varStatus中包含了循环时候的诸多属性 比如这次循环所得元素的下标
基础配置
SpringMVC-servlet.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:tx="http://www.springframework.org/schema/tx"
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/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
<!-- 配置Mybatis -->
<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="root" />
<property name="password" value="123456" />
<property name="jdbcUrl" value="jdbc:mysql:///MVCDB" />
<property name="driverClass" value="com.mysql.jdbc.Driver" />
</bean>
<bean name="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 扫描mapper与接口 这种方式得保证接口和mapper名字路径相同 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.lanou.dao"></property>
</bean>
<!-- 事务管理器 -->
<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 事务注解驱动 -->
<tx:annotation-driven/>
<context:component-scan base-package="com.lanou"></context:component-scan>
</beans>
Student.java
package com.lanou.bean;
public class Student {
private int s_id;
private int s_age;
private String s_name;
private String s_gender;
private String s_href;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public int getS_id() {
return s_id;
}
public void setS_id(int s_id) {
this.s_id = s_id;
}
public int getS_age() {
return s_age;
}
public void setS_age(int s_age) {
this.s_age = s_age;
}
public String getS_name() {
return s_name;
}
public void setS_name(String s_name) {
this.s_name = s_name;
}
public String getS_gender() {
return s_gender;
}
public void setS_gender(String s_gender) {
this.s_gender = s_gender;
}
public String getS_href() {
return s_href;
}
public void setS_href(String s_href) {
this.s_href = s_href;
}
@Override
public String toString() {
return "Student [s_id=" + s_id + ", s_age=" + s_age + ", s_name=" + s_name + ", s_gender=" + s_gender
+ ", s_href=" + s_href + "]";
}
}
StudentDao.java
package com.lanou.dao;
import java.util.List;
import com.lanou.bean.Student;
public interface StudentDao {
public List<Student> getStudents();
}
StudentDao.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lanou.dao.StudentDao">
<select id="getStudents" resultType="com.lanou.bean.Student">
select * from student
</select>
</mapper>
StudentService.java
package com.lanou.service;
import java.util.List;
import com.lanou.bean.Student;
public interface StudentService {
public List<Student> getStudents();
}
StudentServiceImpl.java
package com.lanou.serviceImpl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import com.lanou.bean.Student;
import com.lanou.dao.StudentDao;
import com.lanou.service.StudentService;
@Repository
@Service
public class StudentServiceImpl implements StudentService{
@Autowired
private StudentDao studentDao;
@Override
public List<Student> getStudents() {
// TODO Auto-generated method stub
List<Student> students = studentDao.getStudents();
return students;
}
}
StudentController.java
package com.lanou.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import com.lanou.bean.Student;
import com.lanou.service.StudentService;
@Controller
public class StudentController {
@Autowired
private StudentService studentService;
@RequestMapping("getStudents.action")
public String getStudents(Model model) {
List<Student> students = studentService.getStudents();
model.addAttribute("students", students);
return "list.jsp";
}
}
list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!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="updateStudent.action">
<table width="100%" border="1px">
<tr>
<th>编号</th>
<th>姓名</th>
<th>年龄</th>
<th>性别</th>
<th>操作</th>
</tr>
<c:forEach items="${students }" var="item">
<tr>
<th>${item.s_id }</th>
<th>${item.s_name }</th>
<th>${item.s_age }</th>
<th>${item.s_gender }</th>
<th><a href="getStudentById.action?id=${item_id }" >修改</a>
</tr>
</c:forEach>
</table>
</form>
</body>
</html>
测试:实现批量删除
传入两个或以上id 进行删除
对list.jsp进行修改
form表单的地址改为删除地址 在最后添加删除格
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!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="deleteStudentsByIds.action">
<table width="100%" border="1px">
<tr>
<th><input type="checkbox" />
<th>编号</th>
<th>姓名</th>
<th>年龄</th>
<th>性别</th>
<th>操作</th>
</tr>
<c:forEach items="${students }" var="item">
<tr>
<th><input type="checkbox" value="${item.s_id }" name="ids">
<th>${item.s_id }</th>
<th>${item.s_name }</th>
<th>${item.s_age }</th>
<th>${item.s_gender }</th>
<th><a href="getStudentById.action?id=${item_id }" >修改</a>
</tr>
</c:forEach>
</table>
<input type="submit" value="删除" />
</form>
</body>
</html>
StudentController.java
public class StudentController {
@Autowired
private StudentService studentService;
@RequestMapping("getStudents.action")
public String getStudents(Model model) {
List<Student> students = studentService.getStudents();
model.addAttribute("students", students);
return "list.jsp";
}
@RequestMapping("deleteStudentsByIds.action")
public String deleteStudentsByIds(Integer[] ids) {
System.out.println(Arrays.toString(ids));
return "forward:getStudents.action";
}
}
先访问getStudents.action 得到结果后返回list.jsp list.jsp中选择任意复选框 点击删除
按钮 则会跳转到deleteStudentsByIds.action 方法中将所得到的ID打印出来 从而证明从controller
中可以得到前台传过来的数据
根据所得id 从数据库中将其删除
StudentController.java
@Controller
public class StudentController {
@Autowired
private StudentService studentService;
Integer[] ids;
@RequestMapping("getStudents.action")
public String getStudents(Model model) {
List<Student> students = studentService.getStudents();
model.addAttribute("students", students);
return "list.jsp";
}
@RequestMapping("deleteStudentsByIds.action")
public String deleteStudentsByIds(Integer[] ids) {
this.ids = ids;
System.out.println(Arrays.toString(ids));
studentService.deleteStudentsByIds(ids);
return "forward:getStudents.action";
}
}
StudentService.java
import java.util.List;
import com.lanou.bean.Student;
public interface StudentService {
public List<Student> getStudents();
public void deleteStudentsByIds(Integer[] ids);
}
StudentServiceImpl.java
package com.lanou.serviceImpl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import com.lanou.bean.Student;
import com.lanou.dao.StudentDao;
import com.lanou.service.StudentService;
@Repository
@Service
public class StudentServiceImpl implements StudentService{
@Autowired
private StudentDao studentDao;
@Override
public List<Student> getStudents() {
// TODO Auto-generated method stub
List<Student> students = studentDao.getStudents();
return students;
}
@Override
public void deleteStudentsByIds(Integer[] ids) {
// TODO Auto-generated method stub
studentDao.deleteStudentsByIds(ids);
}
}
StudentDao.java
public interface StudentDao {
public List<Student> getStudents();
public void deleteStudentsByIds(@Param("ids") Integer[] ids);
}
StudentDao.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lanou.dao.StudentDao">
<select id="getStudents" resultType="com.lanou.bean.Student">
select * from student
</select>
<delete id="deleteStudentsByIds" parameterType="java.lang.Integer">
delete from student where s_id in
<foreach collection="ids" item="id" open="(" separator="," close=")" >
#{id}
</foreach>
</delete>
</mapper>
批量修改
批量修改 需要传一堆属性 数据比较复杂
1.使用包装类来接收 SpringMVC中不支持List直接作为参数
2.推荐使用json 更加通用
自定义异常
处理机制:dao层抛给Service抛给Controller核心控制器
核心控制器会在容器中找一个异常处理器对象
1.创建异常处理类 继承HandleExceptionResolver
2.将这个类注册到容器中
使用异常处理器 对于自定义可以根据不同异常进行具体的处理
比如发生异常跳转页面
@RequestMapping(value="getStudent.action")
public String getStudent(Model model) {
// 需求 找10个人参加比赛 如果不足十人则抛出异常
// 使用自定义异常
List<Student> stus = studentService.getStudents();
if (stus.size() < 10) {
throw new MyException("人数不够");
}
model.addAttribute("students", stus);
System.out.println("收到请求了 啦啦啦");
return "list.jsp";
}
package com.lanou.exception;
public class MyException extends RuntimeException{
private String msg;
public MyException(String string) {
this.msg = string;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
public class MyExceptionHandle implements HandlerExceptionResolver{
// 当在处理某个请求发生异常时 将自动调用该方法进行处理
// 第三个参数表示异常位置
// 返回值:ModelAndView 用来决定错误时显示的页面 以及数据
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object location,
Exception exception) {
System.out.println("异常发生的位置:" + location);
System.out.println("异常信息:" + exception);
// 发生异常后进入exception.jsp
// 并将位置和错误信息传给页面展示
// 对于系统异常 我们没有办法具体处理 因为不知道为什么发生
// 然而对已知异常 就可以进行具体的处理
ModelAndView mv = new ModelAndView();
if(exception instanceof MyException) {
MyException myException = (MyException) exception;
System.out.println(myException.getMsg());
mv.addObject("msg", myException.getMsg());
}
mv.setViewName("exception.jsp");
mv.addObject("location",location);
return mv;
}
}
<!-- 配置异常处理器 -->
<bean class="com.lanou.exception.MyExceptionHandle" />
自定义转换器
1.创建参数转换器 实现Converter接口
2.在配置文件中配置转换器
SpringMVC框架 会在接受到请求后 自动执行转换器中的代码
最后将转换结果交给Controller使用
系统会自动先执行MyIntConverter再携带着返回值访问controller
<!-- 注册自定义参数转换器 -->
<mvc:annotation-driven conversion-service="converters" />
<bean name="converters" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<bean class="com.lanou.converter.MyIntConverter"></bean>
</property>
</bean>
public class MyIntConverter implements Converter<String, Integer>{
@Override
public Integer convert(String param) {
System.out.println(param);
// 将字符串分割为单个字符
// 提取值在0-9之间的字符组成新的整形
char[] charArray = param.toCharArray();
String newParam = "";
for (char c : charArray) {
if(c >= '0' && c <= '9') {
newParam += c;
}
}
System.out.println("转换后的参数:" + newParam);
return Integer.valueOf(newParam);
}
}
上传文件
需求实现给学生上传头像
1.给学生表添加头像字段保存图片路径
2.修改响应的实体类 与 映射文件
思路:
上传文件后保存到指定的路径
数据库中保存文件的名字
注意不要放在编辑中 因为tomcat发布项目时时为其创建了一个新路径
导致一个问题 你放在编辑器中的文件 不会立马放入tomcate中
1.通常我们会将收到的文件放在服务器的某个路径下
tomcate中可以添加虚拟路径 来简化代码
例如:原路径: /user/local/project/myProject/images
在页面中访问的话 写起来比较麻烦
我们可以配置虚拟路径
/user/local/project/myProject/ => myProject
最终通过myProject/images来访问
2.也可以使用相对于classpath的路径
上传步骤
<!-- 配置文件上传解析器 -->
<bean name="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="5000000" />
</bean>
@RequestMapping("updateStudent.action")
public String updateStudents(Studenteger stu,MultipartFile photo) {
System.out.println(photo);
// 1.将收到的文件搞到硬盘上去
// 随机一个文件名 32长度的字符串
String fileName = UUID.randomUUID().toString();
// 获取后缀名 getOriginalFilename()整个原始文件名
String extension = FilenameUtils.getExtension(photo.getOriginalFilename());
File file = new File("/Users/lanou/Documents/images/" + fileName + "." + extension);
// 2.将文件名存到数据库
try {
photo.transferTo(file);
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "forward:getStudentById.action";
}
@RequestMapping("getStudentById.action")
public String getStudentById(Integer id,Model model) {
System.out.println(id);
Student student = studentService.getStudentById(id);
model.addAttribute("student", student);
return "update.jsp";
}
update.jsp
<%@ 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="updateStudent.action" method="post" enctype="multipart/form-data">
<input type="hidden" name="s_id" value="${student.s_id }" >
<table>
<tr>
<td>姓名
<td><input name="s_name" value="${student.s_name }">
</tr>
<td>性别
<td><input name="s_gender" value="${student.s_gender }">
<tr>
<td>年龄
<td><input name="s_age" value="${student.s_age }">
<tr><td>头像
<td><img alt="这是我头像" src="/images/${student.s_href }"></td>
<td><input type="file" name="photo"></td>
</tr>
</tr>
<td><input value="更新" type="submit">
</table>
</form>
</body>
</html>