实验报告6-SSM框架整合

2024-06-02 23:44
文章标签 ssm 整合 框架 实验报告

本文主要是介绍实验报告6-SSM框架整合,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

资料下载链接

实验报告6-SSM框架整合(1验证码)

实验报告6-SSM框架整合(2管理员登录)

实验报告6-SSM框架整合(3商品的分页查询)

实验报告6-SSM框架整合(4权限拦截器)

一、需求分析

使用普通整合方式实现SSM(SpringMVC、Spring和MyBatis)整合,实现管理员登录、后台首页和图书管理功能。

二、编码实现

1、初始代码

idea运行Exp6项目,启动Tomcat,显示HelloWorld页面

2、配置静态资源的访问映射

webapp目录下,新建/static

static目录下,导入layuimini-v2

applicationContext.xml

    <!-- 配置静态资源的访问映射 --><mvc:resources mapping="/static/**" location="/static/" />

测试。地址栏中输入“http://localhost:8080/static/layuimini-v2/images/bg.jpg”,能正常显示图片

3、验证码

java目录,com.sw.controller包

@Controller
@RequestMapping("/admin")
public class AdminController {@GetMapping("/login")public String login(){return "/admin/login";}
}

webapp目录,/pages/admin/login.jsp,复制layuimini-v2/page/login-2.html,并修改静态资源引用路径

com.sw.controller包,CommonController

@Controller
@RequestMapping("/common")
public class CommonController {@GetMapping("/createCaptcha")public void createCaptcha(HttpServletRequest request, HttpServletResponse response) throws IOException {Captcha captcha = new ArithmeticCaptcha(115, 42);//算术类型captcha.setCharType(2);//本次产生的验证码String text = captcha.text();System.out.println(text);//将验证码进行缓存HttpSession session = request.getSession();session.setAttribute("captcha",text);//将生成的验证码图片通过输出流写回客户端浏览器页面captcha.out(response.getOutputStream());}
}

webapp目录,/pages/user/login.jsp

定义jquery

            $ = layui.jquery,

修改验证码图片鼠标悬停样式

.admin-captcha {cursor: pointer}

设置验证码图片的src属性,并设置单击事件

<img class="admin-captcha" src="/common/createCaptcha" onclick="changeCaptcha()">
        window.changeCaptcha=function () {var img = $("img.admin-captcha")img.attr("src","/common/createCaptcha?t=" + new Date().getTime())}

com.sw.util包,引入ApiResult类

com.sw.controller包,CommonController

    @GetMapping("/checkCaptcha")@ResponseBodypublic ApiResult checkCaptcha(String captcha,HttpServletRequest request){ApiResult result = new ApiResult();//数据校验if (captcha==null || captcha==""){result.setErrorCode();result.setMsg("验证码为空");return result;}//整数校验Integer captchaFront = 0;try {captchaFront = Integer.parseInt(captcha);}catch (Exception ex){System.out.println(ex.getMessage());result.setErrorCode();result.setMsg("验证码格式错误");return result;}String str = request.getSession().getAttribute("captcha").toString();Integer sessionCaptcha = Integer.parseInt(str);if (!sessionCaptcha.equals(captchaFront)){result.setErrorCode();result.setMsg("验证码错误");}return result;}

webapp目录,/pages/admin/login.jsp

            //验证校验码var captchaFlag = true$.ajax({//同步请求async: false,//请求地址url:"/common/checkCaptcha",//传递的数据data:{captcha:data.captcha},//返回数据类型dataType:"json",success:function(res){if (res.status != 200) {layer.alert(res.msg)captchaFlag = falsereturn false}},error: function () {layer.msg("系统异常");return false}})if (!captchaFlag){return false}
4、管理员登录

com.sw.pojo包,User

public class User {private int id;private String username;private String password;private String role;//get、set//tostring
}

com.sw.mapper包,UserMapper

public interface UserMapper {User getOne(User userFront);
}

com/sw/mapper目录,UserMapper.xml

    <select id="getOne" parameterType="User" resultType="User">select * from t_user where username=#{username} and password=#{password} and role=#{role}</select>

com.sw.service包,UserService

    User login(User userFront);

com.sw.service.impl包,UserServiceImpl

@Service("userService")
public class UserServiceImpl implements UserService {@Resourceprivate UserMapper userMapper;@Overridepublic User login(User userFront) {return userMapper.getOne(userFront);}
}

com.sw.util包,MyConst

    public static final String ADMIN_SESSION = "ADMIN_SESSION.17291#$%&*";

com.sw.util包,MD5Util

public class MD5Util {public static String encryptMD5(String input) {try {// 创建MD5加密对象MessageDigest md5 = MessageDigest.getInstance("MD5");// 执行加密操作byte[] messageDigest = md5.digest(input.getBytes());// 将字节数组转换为16进制字符串StringBuilder hexString = new StringBuilder();for (byte b : messageDigest) {String hex = Integer.toHexString(0xff & b);if (hex.length() == 1) {hexString.append('0');}hexString.append(hex);}// 返回加密后的字符串return hexString.toString();} catch (NoSuchAlgorithmException e) {throw new RuntimeException(e);}}
}

com.sw.controller包,AdminController

    @PostMapping("/login")@ResponseBodypublic ApiResult login(User user, HttpServletRequest request){ApiResult result = new ApiResult();//数据校验if (user==null||user.getUsername().equals("")||user.getPassword().equals("")){result.setErrorCode();result.setMsg("后台数据校验失败");}String md5 = MD5Util.encryptMD5(user.getPassword());user.setPassword(md5);user.setRole("admin");User userDb = userService.login(user);//登录失败if (userDb==null){result.setErrorCode();result.setMsg("用户名或者密码错误");return result;}userDb.setPassword("");request.getSession().setAttribute(MyConst.ADMIN_SESSION,userDb);return result;}

webapp目录,/pages/admin/login.jsp

            //异步登录$.ajax({//请求地址url:"/admin/login",type:"post",//传递的数据data:{username:data.username,password:data.password},//返回数据类型dataType:"json",success:function(res){if (res.status != 200) {layer.alert(res.msg)return false}else {window.location = '/admin/index';}},error: function () {layer.msg("系统异常");return false}})

com.sw.controller包,AdminController

    @GetMapping("/index")public String index(){return "/admin/index";}

webapp目录,新建/pages/admin/index.jsp

5、后台首页

webapp目录,/pages/admin/index.jsp,复制layuimini-v2/index.html,并修改静态资源引用路径

com.sw.controller包,ProductController

@Controller
@RequestMapping("/product")
public class ProductController {@GetMapping("/index")public String index(){return "/product/index";}
}

webapp目录,新建/pages/product/index.jsp,复制layuimini-v2/page/table.html,并修改静态资源引用路径

webapp目录,/static/layuimini-v2/api/init.json,删除“主页模板”目录,将“菜单管理”修改为“商品管理”,href指向“/product/index”

6、商品的分页查询

com.sw.pojo包,Product

public class Product {private int id;private String name;private double price;//get、set//tostring
}

com.sw.mapper包,ProductMapper

public interface ProductMapper {List<Product> getList(Product product);
}

com/sw/mapper目录,ProductMapper.xml

    <select id="getList" resultType="Product" parameterType="Product">select * from t_product<where><if test="name!=null and name !=''">and name like concat('%',#{name},'%')</if></where></select>

com.sw.service包,ProductService

    PageInfo<Product> page(int pageNum, int pageSize, Product product);

com.sw.service.impl包,ProductServiceImpl

@Service("productService")
public class ProductServiceImpl implements ProductService {@Resourceprivate ProductMapper productMapper;@Overridepublic PageInfo<Product> page(int pageNum, int pageSize, Product product) {PageHelper.startPage(pageNum,pageSize);PageInfo<Product> pageInfo = new PageInfo(productMapper.getList(product));return pageInfo;}
}

com.sw.util包,MyConst

    public static final Integer PAGE_NUM = 1;public static final Integer PAGE_SIZE = 10;

com.sw.controller包,ProductController

    @PostMapping("/page")@ResponseBodypublic ApiResult<PageInfo<Product>> page(Integer pageNum, Integer pageSize, Product product){ApiResult result = new ApiResult();pageNum = pageNum > 0 ? pageNum : MyConst.PAGE_NUM;pageSize = pageSize > 0 ? pageSize : MyConst.PAGE_SIZE;PageInfo<Product> page = productService.page(pageNum, pageSize, product);result.setData(page);return  result;}

webapp目录,/pages/product/index.jsp

        //初始化分页表格
​form.render()
​url: '/product/page',method:"post",cols: [[{ type:"numbers", width: 60, title: '序号'},{field: 'name', width: 280, title: '商品名'},{field: 'price', width: 80, title: '价格'},]],parseData: function(res){ //res 即为原始返回的数据console.log(res)return {"code": 0, //解析接口状态"msg": res.msg, //解析提示文本"count": res.data.total, //解析数据长度"data":  res.data.list //解析数据列表};},request: {pageName: 'pageNum' //页码的参数名称,默认:page,limitName: 'pageSize' //每页数据量的参数名,默认:limit}

webapp目录,/pages/product/index.jsp

修改第一个输入框的lable为“商品名”

            //执行搜索重载table.reload('currentTableId', {url: '/product/page',method:"post",where:{name:data.field.name,},parseData: function(res){ //res 即为原始返回的数据console.log(res)return {"code": 0, //解析接口状态"msg": res.msg, //解析提示文本"count": res.data.total, //解析数据长度"data":  res.data.list //解析数据列表};},request: {pageName: 'pageNum', //页码的参数名称limitName: 'pageSize' //每页数据量的参数名}}, 'data');return false;
7、权限拦截器

com.sw.interceptor包,MyAdminInterceptor

public class MyAdminInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//合法用户拥有访问权限User userSession = (User) request.getSession().getAttribute(MyConst.ADMIN_SESSION);if(userSession!=null){if(userSession.getRole().equals("admin")){return true;}}//非法用户跳转至登录页面response.sendRedirect("/admin/login");return false;}
}

applicationContext.xml

<!--配置拦截器-->
<mvc:interceptors><!--管理员权限拦截器--><mvc:interceptor><!--需要拦截的请求--><mvc:mapping path="/admin/*"/><mvc:mapping path="/product/*"/><!--放行的请求--><mvc:exclude-mapping path="/admin/login"/><mvc:exclude-mapping path="/common/*"/><!--拦截器全限定名--><bean class="com.sw.interceptor.MyAdminInterceptor"/></mvc:interceptor>
</mvc:interceptors>

这篇关于实验报告6-SSM框架整合的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1025426

相关文章

SpringBoot 整合 Grizzly的过程

《SpringBoot整合Grizzly的过程》Grizzly是一个高性能的、异步的、非阻塞的HTTP服务器框架,它可以与SpringBoot一起提供比传统的Tomcat或Jet... 目录为什么选择 Grizzly?Spring Boot + Grizzly 整合的优势添加依赖自定义 Grizzly 作为

spring6+JDK17实现SSM起步配置文件

《spring6+JDK17实现SSM起步配置文件》本文介绍了使用Spring6和JDK17配置SSM(Spring+SpringMVC+MyBatis)框架,文中通过示例代码介绍的非常详细,对大家的... 目录1.配置POM文件2.在resource目录下新建beans.XML文件,用于配置spirng3

springboot整合gateway的详细过程

《springboot整合gateway的详细过程》本文介绍了如何配置和使用SpringCloudGateway构建一个API网关,通过实例代码介绍了springboot整合gateway的过程,需要... 目录1. 添加依赖2. 配置网关路由3. 启用Eureka客户端(可选)4. 创建主应用类5. 自定

springboot整合 xxl-job及使用步骤

《springboot整合xxl-job及使用步骤》XXL-JOB是一个分布式任务调度平台,用于解决分布式系统中的任务调度和管理问题,文章详细介绍了XXL-JOB的架构,包括调度中心、执行器和Web... 目录一、xxl-job是什么二、使用步骤1. 下载并运行管理端代码2. 访问管理页面,确认是否启动成功

SpringBoot整合kaptcha验证码过程(复制粘贴即可用)

《SpringBoot整合kaptcha验证码过程(复制粘贴即可用)》本文介绍了如何在SpringBoot项目中整合Kaptcha验证码实现,通过配置和编写相应的Controller、工具类以及前端页... 目录SpringBoot整合kaptcha验证码程序目录参考有两种方式在springboot中使用k

Spring Boot 中整合 MyBatis-Plus详细步骤(最新推荐)

《SpringBoot中整合MyBatis-Plus详细步骤(最新推荐)》本文详细介绍了如何在SpringBoot项目中整合MyBatis-Plus,包括整合步骤、基本CRUD操作、分页查询、批... 目录一、整合步骤1. 创建 Spring Boot 项目2. 配置项目依赖3. 配置数据源4. 创建实体类

SpringBoot整合InfluxDB的详细过程

《SpringBoot整合InfluxDB的详细过程》InfluxDB是一个开源的时间序列数据库,由Go语言编写,适用于存储和查询按时间顺序产生的数据,它具有高效的数据存储和查询机制,支持高并发写入和... 目录一、简单介绍InfluxDB是什么?1、主要特点2、应用场景二、使用步骤1、集成原生的Influ

SpringBoot整合Canal+RabbitMQ监听数据变更详解

《SpringBoot整合Canal+RabbitMQ监听数据变更详解》在现代分布式系统中,实时获取数据库的变更信息是一个常见的需求,本文将介绍SpringBoot如何通过整合Canal和Rabbit... 目录需求步骤环境搭建整合SpringBoot与Canal实现客户端Canal整合RabbitMQSp

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte