SpringMVC注解方式
Maven项目结构
1.在pom.xml导入相关依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>day36springMvc</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>war</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
</project>
2新建实体类
Users.java
package com.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Users {
private int uid;
private String name;
private String pass;
private String tel;
private String addr;
}
3.建立dao层
UserDao接口
package com.dao;
import com.pojo.Users;
import java.util.List;
public interface UserDao {
List<Users> getAll();
Users getById(int id);
int update(Users u);
int deleteById(int uid);
int save(Users user);
}
UserDao实体类:通过List集合模拟数据库数据
package com.dao.Impl;
import com.pojo.Users;
import com.dao.UserDao;
import java.util.ArrayList;
import java.util.List;
public class UserDaoImpl implements UserDao {
static List<Users> list = null;
static {
list = new ArrayList<>();
for (int i = 0; i < 50; i++) {
list.add(new Users(i,i+"name",i+"pass",i+"tel",i+"addr"));
}
}
@Override
public List<Users> getAll() {
return list;
}
@Override
public Users getById(int id) {
return list.get(id);
}
@Override
public int update(Users u) {
try {
list.set(u.getUid(),u);
return 1;
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
@Override
public int deleteById(int uid) {
try {
list.remove(uid);
return 1;
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
@Override
public int save(Users user) {
try {
list.add(user);
return 1;
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
}
4.新建service层
UserService接口
package com.service;
import com.pojo.Users;
import java.util.List;
public interface UserService {
List<Users> getAll();
Users getById(int id);
boolean update(Users u);
boolean deleteById(int uid);
boolean save(Users user);
}
UserService接口实现类
package com.service.Impl;
import com.pojo.Users;
import com.dao.Impl.UserDaoImpl;
import com.dao.UserDao;
import com.service.UserService;
import java.util.List;
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoImpl();
@Override
public List<Users> getAll() {
return userDao.getAll();
}
@Override
public Users getById(int id) {
return userDao.getById(id);
}
@Override
public boolean update(Users u) {
return userDao.update(u)>0;
}
@Override
public boolean deleteById(int uid) {
return userDao.deleteById(uid)>0;
}
@Override
public boolean save(Users user) {
return userDao.save(user)>0;
}
}
5.在WEB-INF下创建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:mvc="http://www.springframework.org/schema/mvc"
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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.controller" />
<!--使得所有的静态html资源可以直接被访问-->
<mvc:default-servlet-handler />
<!--
配置springmvc的注解驱动
-->
<mvc:annotation-driven />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/" />
<property name="suffix" value=".jsp" />
</bean>
<!--
配置信息资源,id必须叫messageSource
baseName,相当于是资源文件名,
该文件可以有多个国家和语言版本的副本
-->
<bean class="org.springframework.context.support.ReloadableResourceBundleMessageSource" id="messageSource">
<property name="basename" value="/WEB-INF/msg" />
</bean>
</beans>
6.配置web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 解决中文乱码 -->
<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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
7.编写controller层
package com.controller;
import com.pojo.Users;
import com.service.Impl.UserServiceImpl;
import com.service.UserService;
import com.validate.EmpValidate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
@Controller
@RequestMapping("/users")
public class UsersController {
private UserService userService = new UserServiceImpl();
//两种方式获取users的列表
// @RequestMapping("/showAllUsers")
// public String showAll(HttpServletRequest request){
// List<Users> list = userService.getAll();
//
// request.setAttribute("users",list);
//
// return "users";
// }
@RequestMapping("/showAllUsers")
public ModelAndView showAll(){
List<Users> list = userService.getAll();
return new ModelAndView("users", "list", list);
}
//获取id
@RequestMapping("/getById")
public ModelAndView getById(HttpServletRequest request){
String uid = request.getParameter("uid");
int id = uid == null ?-1 : Integer.parseInt(uid);
Users user = userService.getById(id);
return new ModelAndView("user","user",user);
}
//修改 post请求 传递Users对象
@RequestMapping(value = "/update" ,method = RequestMethod.POST)
public String update(Users user){
boolean flag = userService.update(user);
System.out.println(user);
//修改成功重定向到列表页面
if(flag){
return "redirect:showAllUsers";
}
//修改失败返回当前页
return "";
}
//通过id删除数据 路径传参 需要注意的是路径传参会多一级目录 所以重定向页面采用相对路径
@RequestMapping("/deleteById/{uid}")
public String deleteById(@PathVariable("uid") int uid){
System.out.println(uid);
boolean flag = userService.deleteById(uid);
if(flag){
return "redirect:/users/showAllUsers";
}
return "";
}
//保存数据 对于非法数据进行校验
@RequestMapping("/saveUser")
public ModelAndView save(){
//这里的modeName:users要与下面的错误回显对象对应 否则在saveUser会报500错误
return new ModelAndView("saveUser","users",new Users());
}
@RequestMapping(value = "/saveUser", method = RequestMethod.POST)
public String saveUser(Users users, BindingResult errors, Model m){
// 调用校验类实现校验功能
EmpValidate ev = new EmpValidate();
// 调用校验方法
ev.validate(users, errors);
// 如果错误对象含有错误信息
if(errors.hasErrors()){
m.addAttribute("users", users);
return "saveUser";
}
boolean flag = userService.save(users);
System.out.println(users);
if(flag){
return "redirect:showAllUsers";
}
return "";
}
}
8.编写数据校验类
package com.validate;
import com.pojo.Users;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
/**
* 校验类,用来实现Emp的校验功能
* 包含两个方法:
* support :之对于指定类型的对象进行校验
* validate:真正的校验功能,可以分别实现非空校验和合法性校验
* field要与f:input和f:errors的path对应
* errorCode:要与msg文件中的key对应
* ValidationUtils.rejectIfEmpty(errors, "eid", "emp.eid");非空校验
* errors.rejectValue("salary", "emp.salary.invalidate"); 合法性校验
*/
public class EmpValidate implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return Users.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {
// Users u = (Users) target;
//这里的错误信息user.uid与msg.properties文件中的key相对应
//在springMVC-Servlet配置文件中对错误信息进行了相关配置,配置完成就可以找到相应的配置文件,实现错误信息提示以及错误信息的国际化形式(不同浏览器中文 英文效果)
ValidationUtils.rejectIfEmpty(errors, "uid", "user.uid");
ValidationUtils.rejectIfEmpty(errors, "name", "user.name");
ValidationUtils.rejectIfEmpty(errors, "pass", "user.pass");
// ValidationUtils.rejectIfEmpty(errors, "salary", "emp.salary");
// if ((u.getName().length() < 2)) {
// errors.rejectValue("name", "emp.salary.invalidate");
// }
}
}
9.创建msg配置文件
msg.properties
user.uid=the employee uid cannot be empty.
user.name=the employee name cannot be empty.
user.pass=the employee pass cannot be empty.
msg_en_US.properties(英文)
user.name=the employee name cannot be empty.
user.pass=the employee pass cannot be empty.
msg_zh_CN.properties(中文)通过相应的文字转换工具转换为相应的语言
user.name=\u5458\u5de5\u7f16\u53f7\u4e0d\u80fd\u4e3a\u7a7a
user.pass=\u5458\u5de5\u59d3\u540d\u4e0d\u80fd\u4e3a\u7a7a
10.view包下的jsp页面
users.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>users</title>
</head>
<body>
<table border="1" align="center" width="100%">
<tr>
<th>uid</th>
<th>name</th>
<th>pass</th>
<th>tel</th>
<th>addr</th>
<th>manger</th>
</tr>
<c:forEach items="${list}" var="u">
<tr>
<td>${u.uid}</td>
<td>${u.name}</td>
<td>${u.pass}</td>
<td>${u.tel}</td>
<td>${u.addr}</td>
<td><a href="getById?uid=${u.uid}">update</a>
<a href="deleteById/${u.uid}">delete</a>
<a href="saveUser">save</a></td>
</tr>
</c:forEach>
</table>
</body>
</html>
user.jsp
<%--
Created by IntelliJ IDEA.
User: ylk
Date: 2022/9/21
Time: 20:15
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>userDetail</title>
</head>
<body>
<form action="update" method="post">
uid:<input type="text" name="uid" value="${user.uid}" readonly="readonly"></p>
name:<input type="text" name="name" value="${user.name}"></p>
pass:<input type="text" name="pass" value="${user.pass}"></p>
tel:<input type="text" name="tel" value="${user.tel}"></p>
addr:<input type="text" name="addr" value="${user.addr}"></p>
<input type="submit" value="修改">
</form>
</body>
</html>
saveUser.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--<%@ taglib prefix="f" uri="http://www.springframework.org/tags/form" %>--%>
<html>
<head>
<title>saveUser</title>
<%@ taglib prefix="f" uri="http://www.springframework.org/tags/form" %>
</head>
<body>
<%--@elvariable id="users" type="com.pojo.Users"--%>
<%--这里的commandName="users" 必须为实体类的首字母小写 这里的commandName对应SpringMVC的4.3.6版本已经不建议使用 如果使用SpringMVC 5的版本则需要将其更换为modelAttribute--%>
<f:form action="saveUser" method="post" commandName="users">
uid:<f:input type="text" path="uid"/><f:errors path="uid" /><p/>
name:<f:input type="text" path="name" /><f:errors path="name" /><p/>
pass:<f:input type="text" path="pass" /><f:errors path="pass" /><p/>
tel:<f:input type="text" path="tel" /><p/>
addr:<f:input type="text" path="addr" /><p/>`
<input type="submit" value="添加">
</f:form>
</body>
</html>
11.部署tomcat(前面maven项目有提过,也可以在pom.xml添加Tomcat插件的方式)与dependencies同级
<build>
<plugins>
<!-- define the project compile level -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
添加tomcat插件
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<path>/</path>
<port>8081</port>
</configuration>
</plugin>
</plugins>
</build>
12.访问效果(注意访问路径与之前不同不用加.jsp)
13.数据校验实现效果(pass name 为空,则错误信息回显到页面,因为浏览器默认中文,错误信息对应msg_zh_CN.properties中的错误信息)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UMr7wXQZ-1663857830182)
扩展:SpringMVC的Jason输出
在pom.xml导入依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.0</version>
</dependency>
在controller层添加@RestController注解方式的controller
package com.controller;
import com.pojo.Users;
import com.service.Impl.UserServiceImpl;
import com.service.UserService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
@RestController
public class UsersRequestController {
private UserService userService = new UserServiceImpl();
// @RequestMapping("/showAllUsers")
// public ModelAndView showAll(){
// List<Users> list = userService.getAll();
// return new ModelAndView("users", "list", list);
// }
//查询所有
@GetMapping("/Users")
public List<Users> getAllUsers(){
return userService.getAll();
}
// @RequestMapping("/getById")
// public ModelAndView getById(HttpServletRequest request){
// String uid = request.getParameter("uid");
// int id = uid == null ?-1 : Integer.parseInt(uid);
// Users user = userService.getById(id);
// return new ModelAndView("user","user",user);
// }
//根据id查询对象
@GetMapping("/Users/{eid}")
public Users getUserByEid(@PathVariable int eid){
return userService.getById(eid);
}
// @RequestMapping(value = "/saveUser", method = RequestMethod.POST)
// public String saveUser(Users users){
// boolean flag = userService.save(users);
// System.out.println(users);
// if(flag){
// return "redirect:showAllUsers";
// }
// return "";
// }
//保存对象
@PostMapping("/SaveUser")
public boolean saveUser(Users e){
return userService.save(e);
}
// //分页查询的两种方式
@GetMapping("/UsersByPage/{cp}/{ps}")
public List<Users> getUsersByPage(@PathVariable int cp, @PathVariable int ps){
int si = (cp - 1) * ps;
return userService.getUsersByPage(si, ps);
}
@GetMapping("/UsersByPage02")
public List<Users> getUsersByPage02(@RequestParam(value = "cp", defaultValue = "1") int cp, @RequestParam(value = "ps", defaultValue = "5") int ps){
int si = (cp - 1) * ps;
return userService.getUsersByPage(si, ps);
}
}
访问效果
无须jsp页面进行访问
(页面输出json格式的数据,体现出前后端分离的效果)