用户注册案例--mvc架构的实现

用户注册案例--浅谈servlet

本案例为用户注册案例,同时介绍一部分之前经常用得到servlet的知识.servlet是javaEE的技术规范之一.

基于MCV架构的分析

1.dao层在mapper代理文件中写入insert的操作,对于成功注册的用户直接写入数据库,以及查询操作判断用户名是否已经存在

 User getUserByUsername(@Param("username") String username ,@Param("password") String password);@Select("select * from tb_user where username=#{username}")User findUsername(@Param("username") String username);@Insert("insert into tb_user values(#{username},#{password},#{type})")void insertUser(User user);

2.service层,在本层中封装对于数据库的操作,同时记得执行操作之后将数据提交

   public void InsertUser(User user) throws IOException {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);userMapper.insertUser(user);sqlSession.commit();sqlSession.close();}public boolean findUser(String username) throws IOException {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(com.stdu.mapper.UserMapper.class);User user=userMapper.findUsername(username);sqlSession.close();if(user==null){return false;}return true;}

3.在web层分为两部分,第一部分是在jsp中设计表单将表单中的信息提交到servlet中,然后进行逻辑判断,对于用户名已经存在的情况和成功注册的情况进行重定向和dao层操作
jsp的代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"  %>
<html>
<head><title>register</title>
</head>
<body><h2>注册账号</h2><form method="POST" action="/LogIn/registerServlet" accept-charset="UTF-8"><p>${wr_message} </p><p>用户名 <input type="text" name="username"> </p><p>密码 <input type="password" name="password"></p><p>验证码  <input type="text" name="code">     <img src="/LogIn/insureServlet" id="insure"></p><input type="submit" value="注册">
</form>
<script>document.getElementById("insure").onclick = function () {document.getElementById("insure").src = "/LogIn/insureServlet?"+ new Date().getMilliseconds();}
</script>
</body>
</html>

sevlet的代码

package com.stdu.servlet;import com.mysql.cj.Session;
import com.stdu.pojo.User;
import com.stdu.service.UserService;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/registerServlet")
public class RegisterServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {UserService userService = new UserService();String username = req.getParameter("username");String password = req.getParameter("password");String code = req.getParameter("code");HttpSession session=req.getSession();String insure=session.getAttribute("insure").toString();if(code==null||!code.equals(insure)){req.setAttribute("wr_message","验证码错误");req.getRequestDispatcher("register.jsp").forward(req, resp);return ;}boolean st=userService.findUser(username);if(st){req.setAttribute("wr_message","用户名已经存在");req.getRequestDispatcher("register.jsp").forward(req, resp);}else{User user = new User();user.setUsername(username);user.setPassword(password);userService.InsertUser(user);req.setAttribute("wr_message","注册成功");req.getRequestDispatcher("index.jsp").forward(req, resp);}}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
}package com.stdu.servlet;import com.stdu.util.CheckCodeUtil;import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Writer;
@WebServlet("/insureServlet")
public class InsureServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletOutputStream outputStream= resp.getOutputStream();String insure=CheckCodeUtil.outputVerifyImage(140,50,outputStream,4);req.getSession().setAttribute("insure",insure);}
}

技术学习

在本案例中,加入了注册需要验证码的功能来防止机器人暴力注册来冲掉数据库.功能实现包括以下几个步骤:
1.生成验证码图片,这里使用了一个工具类,然后将图片输出到servlet的输出流,并且将src放到输出流就可以得到图片
2.同时将得到的验证码放到session上使得数据的验证可以实现
3.将图片使用js的语法绑定事件使得点击图片可以实现图片的替换

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/827340.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSP2024 前集训:NOIP2024加赛 1

前言赛时本来 rk3,赛后自己加 hack 卡自己于是成 rk4 了。 因为这场是假做法大战,T1 假贪心有 \(92pts\);T2 \(O(n^2m)\) 能过(是因为数据里 \(m\le 10\)); T3 相当抽象,赛时我打的爆搜只加了一个剪枝能得 \(70pts\),赛后发现无解的时候会跑满,于是提前判掉无解就过了…

AI辅助动画制作,现实到虚拟仅需要一个摄像头。多种AI技术融合赋能传统行业,或是产业趋势?

AI辅助动画制作,现实到虚拟仅需要一个摄像头。图源:youtube authour autodesk media & entertainment 不是元宇宙,是动画。 2024年10.30日。美国加利福尼亚公司 Wonder dynamic 发布了最新的产品视频。只需要一个摄像头,我们可以把所有的一切搬到虚拟世界。此产品利用多…

chapter14

第一题问题首先,编写一个名为 null.c 的简单程序,它创建一个指向整数的指针,将其设置为NULL,然后尝试对其进行释放内存操作。把它编译成一个名为 null 的可执行文件。当你运行这个程序时会发生什么?自己写的输出如下:无任何输出或错误提示。 第二题问题接下来,编译该程序…

0XGAME [Week 3] 重生之我在南邮当CTF大王

0XGAME [Week 3] 重生之我在南邮当CTF大王 新尝试:源文件找线索;新知识:兽音加密 下载是个游戏和源代码,玩了以下,感觉答对问题也是可以得到flag,但是感觉耗时,而且应该有藏flag的地方,在一堆文件里面找,data文件夹里面的4个地图json文件,进去发现了flag字眼是个2,那…

sentinel微服务限流

sentinel(微服务限流) 官网地址:https://sentinelguard.io/zh-cn/ 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是由阿里巴巴开源的一款流量防护组件,Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 微服…

RabbitMQ工作模式

RabbitMQ工作模式RabbitMQ提供了多种工作模式:简单模式,work模式 ,Publish/Subscribe发布与订阅模式,Routing路由模式,Topics主题模式等官网对应模式介绍:https://www.rabbitmq.com/getstarted.html 1、简单模式 生产者直接发送消息到队列上(虽然没有指明使用交换机,但是…

RabbitMQ消息幂等性保障

消息幂等性保障幂等性指一次和多次请求某一个资源,对于资源本身应该具有同样的结果。也就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同。在MQ中指,消费多条相同的消息,得到与消费该消息一次相同的结果消息幂等性保障 乐观锁机制 @Component public class …

WPF Button控件 这里可以点一下

WPF Button控件 这里可以点一下button表示一个 Windows 按钮控件,该控件对 Click 事件做出反应。 可以点一下button,执行程序操作,如:显示对话框,更改显示内容。 button的content属性表示按钮上显示的文字。<StackPanel><!-- 一个按钮控件,太小了,根本就看不到…

WPF Textbox控件 这里可以输入文字

WPF Textbox控件 这里可以输入文字 textbox控件,用于输入文字。如网页上输入账号密码的地方就是文本框。 文本框的text属性可以提示文字,只能包含无格式文本。

蛋白粉?蛋白质

蛋白粉不能用开水冲,但我们摄入的蛋白质却大都经过了烹煮。 为什么蛋白质不怕开水,而蛋白粉怕开水? 这似乎是矛盾的,其实不然。 问题是,很多人并不了解蛋白质的分子结构,不了解蛋白粉的溶解原理。 如果不了解其中的原理,很容易给出错误的解释。咳咳咳~~干货内容一次可…

【考试题解】多校A层冲刺NOIP2024模拟赛18

目录A. 选彩笔(rgb)题目内容部分分正解思路代码B. 兵蚁排序(sort)题目内容部分分75pts正解思路代码C. 人口局DBA(dba)题目内容部分分60pts正解思路代码D. 银行的源起(banking) A. 选彩笔(rgb) 题目内容 有 \(N\) 支彩笔,每支彩笔有 \(R_i,G_i,B_i\) 三个属性。定义两只彩笔 \(…