SpringMVC

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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值