SpringMVC注解方式

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格式的数据,体现出前后端分离的效果)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值