一、需求说明
功能1.显示所有学生信息,url:stus,请求方式:GET,显示效果
功能2.添加学生信息,有三个操作,一个是url:stu的GET操作用以显示添加界面,然后url为stu的POST的操作然后再重定向到显示所有学生页面!
功能3.删除某个学生信息,url为stu/{id}后面id即删除学生的学号id!请求方法为delete
功能4.修改某个学生的信息,三个操作,url为stu/{id}的GET操作显示修改页面,然后url为stu的PUT操作修改信息,完成修改后就重定向到list中显示所有学生信息!!
需要新建的类和相关页面:
实体类:Student School 其中School与Student有一对多的关系!
dao:StudentDao SchoolDao
控制器 StudentHandler
二、代码
使用Maven在intellij里重新新建一个SpringMVC程序,有了许多前车之鉴,希望不会再犯类似的错误!
新建的项目目录如下:
1、首先导入相关依赖及配置
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<!--这个jar文件包含Web应用开发时,用到Spring框架时所需的核心类,包括自动载入WebApplicationContext特性的类、Struts与JSF集成类、文件上传的支持类、Filter类和大量工具辅助类。-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<!--这个jar文件包含Spring MVC框架相关的所有类。
包含国际化、标签、Theme、视图展现的FreeMarker、
JasperReports、Tiles、Velocity、XSLT相关类。当
然,如果你的应用使用了独立的MVC框架,则无需这个
JAR文件里的任何类。-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- springframe end -->
<!--log4j日志包 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.6.1</version>
</dependency>
<!-- jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-coyote</artifactId>
<version>7.0.39</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
在properties中添加
<spring.version>4.1.1.RELEASE</spring.version>
即可,依赖本可以不用添加那么多的,只是怕会遗漏什么,所以全加上!
2、新建相应的包和文件
getter和setter省略
public class Student {
public final static boolean female = true;
public final static boolean male = false;
private int id;
private String name;
private boolean gender;
private int age;
private School school;
}
public class School {
private int id;
private String name;
}
public class SchoolDao {
private static Map<Integer, School> map = new HashMap<>();
static {
map.put(1, new School(1, "aaSchool"));
map.put(2, new School(2, "bbSchool"));
map.put(3, new School(3, "ccSchool"));
map.put(4, new School(4, "ddSchool"));
}
public Collection<School> getAllSchool() {
return map.values();
}
public School getSchoolById(int id) {
return map.get(id);
}
}
public class StudentDao {
private static Map<Integer, Student> map = new HashMap<>();
static {
map.put(1, new Student(1, "aaaa", Student.female, 18,new School(1, "aaSchool")));
map.put(2, new Student(2, "bbbb",Student.female,20,new School(2, "bbSchool")));
map.put(3, new Student(3, "cccc", Student.male,21,new School(3, "ccSchool")));
map.put(4, new Student(4, "dddd",Student.male,19,new School(4, "ddSchool")));
}
public Collection<Student> getAllStudent() {
return map.values();
}
public Student getStudentById(int id) {
return map.get(id);
}
public void deleteStudentById(int id) {
map.remove(id);
}
public void saveStudent(Student student) {
map.put(student.getId(), student);
}
}
这里不从数据库中获取数据,重点不在这里,获取静态数据就行了!
3、相关配置
web.xml
配置diispatcherServlet和EncodingFilter!
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
如果添加后报错,就把web.xml的前面的
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
去掉就行了!
配置请求编码过滤器,使得能够处理中文请求:
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
配置HiddenHttpMethodFilter使得其能使用其父类OncePerRequestFilter的doFilterInternal方法,将请求的method值转化为普通的http的请求方法!然后到controller中找找到相应的控制方法!
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
SpringMVC·配置文件springmvc.xml
web.xml中配置的springMVC的配置文件位置为classpath,所以在src目录下新建一个springmvc.xml文件
添加代码配置视图解析器:
<bean name="internalResouceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"> </property>
<property name="suffix" value=".jsp"> </property>
</bean>
添加自动扫描的包
<context:component-scan base-package="cn.jxufe"/>
4.配置controller类
先配置一个方法!注入studentDao属性。
@Controller
public class StudentHandler {
@Autowired
private StudentDao studentDao;
@RequestMapping(value = "/getAll")
public String getAll(Map<String, List<Student>> map) {
map.put ("list", (List<Student>)studentDao.getAllStudent());
return "list";
}
}
所以我们要在springmvc.xml文件中添加:
<bean name="studentDao" class="cn.jxufe.dao.StudentDao"> </bean>
控制器方法中直接把list放入了map中,SpringMVC自动将其注入request域中,不用像我之前使用的那种使用Servlet原生api,手动注入请求域!
5.设计视图
在目标视图页面代码(对于其中使用的某些标签,我们还需导入standard依赖!):
<!---https://mvnrepository.com/artifact/taglibs/standard -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>所有信息</title>
</head>
<body>
<c:if test="${empty requestScope.list}">
暂时没有学生信息!
</c:if>
<c:if test="${not empty requestScope.list}">
<table>
<tr>
<th>学号</th>
<th>姓名</th>
<th>性别</th>
<th>年龄</th>
<th>学校</th>
</tr>
<tr>
<c:forEach items="${requestScope.list}" var="stu">
<tr>
<td>${stu.id}</td>
<td>${stu.name}</td>
<td>${stu.gender?"male":"female"}</td>
<td>${stu.age}</td>
<td>${stu.school.name}</td>
</tr>
</c:forEach>
</table>
</c:if>
</body>
</html>
index.jsp页面添加代码:
<form action="/stus" method="post">
<input type="hidden" name="_method" value="GET">
<input type="submit" value="获取所有学生信息">
</form>
6.运行效果
index中:
list.jsp中:
成功!