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">
<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>
<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();
}
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() {
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() {
List<Student> students = studentDao.getStudents();
return students;
}
@Override
public void deleteStudentsByIds(Integer[] ids) {
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) {
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{
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object location,
Exception exception) {
System.out.println(
"异常发生的位置:" + location);
System.out.println(
"异常信息:" +
exception);
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);
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);
String fileName = UUID.randomUUID().toString();
String extension = FilenameUtils.getExtension(photo.getOriginalFilename());
File file =
new File(
"/Users/lanou/Documents/images/" + fileName +
"." + extension);
try {
photo.transferTo(file);
}
catch (IllegalStateException e) {
e.printStackTrace();
}
catch (IOException e) {
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>