SpringMVC

xiaoxiao2021-02-28  60

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>
转载请注明原文地址: https://www.6miu.com/read-2622810.html

最新回复(0)