jsp+servlet+mysql简单实现用户登陆注册
原码,项目中遇到的错误,解决方法,文章最后有链接可以获取
项目简介
*有的网友说在修改和删除时会触发error,建议各位不要去把用户名命名为中文!
功能描述
登陆,注册,用户一览表,修改,删除,添加,模糊查询和精确查询
采用的技术及环境
JSP:前端的信息展示
Servlet:业务逻辑功能实现,及调用数据库的实现数据处理和传输
MySQL:用来实现数据存储
利用Eclipse来实现,MySQL数据库版本:5.x
运行效果展示
数据库数据
项目结构图
*因屏幕小,截图用了两张图片
登陆页面
登陆成功用户一览表页面
注册页面
*因我在数据设计表时,性别(sex)设置的大小为2长度,所以我这里输入一个字符,为了避免数据超出范围
查询可选项
模糊查询班级中有“1”的用户实现
修改用户界面
删除没有界面提示,直接删除
项目创建逻辑理解
整体理解
以jsp-业务逻辑代码-数据库为一条中心线
jsp:负责数据的展示和数据的收集
web.xml:负责当前页面信息提交给谁,哪个servlet来处理当前页面提交的数据
servlet:用来进行数据的处理和数据的传输(jsp<==>数据库)
jsp
前端的页面编写
只要有一些html基础,会编写几个常见的标签就可以。
要会用js获取它们的值,这样就可以了
文本框:<input type="text" id="username" />
密码框:<input type="password" id='"password">
单选按钮:<input type="radio" name="sex" value="0" />男<input type="radio" name="sex" value="1">
……
form表单:
<form method="post" action="loginServlet" >
这中间用来编写用户要提交的数据(要用input,button)
<input type="submit" value="提交">
<input type="reset" value="重置">
</form>
EL表达式:
用来获取servlet传递到页面的数据
首先要在jsp页面声明文件头,用来告诉jsp页面,可以使用EL表达式
假如说你从servlet向jsp传递了一个User对象,你要在jsp页面中输出User对象的属性,你要把这个User类在文件头中声明:
<%@page import="cn.anxcyun.www.po.User" %>
import="包名.类名"
常见:
获取值${name} name:你在servlet中定义的值(小写字母,如果大写的话,容易出错)
我在这里使用到了JSTL,JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。(文章最后有链接,一看就懂)
web.xml相关配置编写
文件位置:项目/WebContent/WEB-INF/web.xml
文件在创建时可以自动生成(须打对勾),如果没有按如下图示:
文件截图:
文件:
<? xml>
<web-app 加上文件的规范(自动生成)>
<display-name>项目名</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>项目运行时的第一个页面(可自己更改)
</welcome-file-list>
<!-- 注册 -->这是注释不用管 ,一个servlet要如下两个标签(servlet和servlet-mappping)
<servlet>
<servlet-name>register</servlet-name> 定义一个servlet,jsp的form表单中的action
<servlet-class>cn.anxcyun.www.servlet.RegisterServlet</servlet-class> 你jsp提交数据后要执行的servlet类
</servlet>
<servlet-mapping>
<servlet-name>register</servlet-name> 两个servlet的name必须相同
<url-pattern>/register</url-pattern> 当你运行成功以后,下一个页面的url栏显示的内容:localhost:8080/项目名/你定义的url-pattern
</servlet-mapping>
</web-app>
servlet的逻辑层编写
思想
分模块化思想:因为这一层涉及到了对数据的处理和页面跳转到哪个页面,所以说,我利用了几个包来实现它:
servlet: 获取页面提交的数据,交给下一层处理,根据处理的结果,指定要跳转的页面
control: 目前没有实际的用途,就是servlet和dao层的接口传递
dao: 用来实现与数据库的业务逻辑,包括表的增删改查,(查询:登陆查询,一览表查询)
po: 基类(bean)主要是用来映射数据库中的表,一个类对应一个表(表的列值对应类的变量属性),这样在查询时数据传递时,可以用对象传递
细化:
servlet:
public class myServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.service(req, resp);
}
}
首先要继承于 HttpServlet类
(导入包:import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;)
Eclipse的快捷键:
导入包:ctrl + shift + O
快速生成方法:alt + /
然后重写默认方法:service + (alt + /)
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub 可以删除
super.service(req, resp); 可以删除
}
获取值:
String number = new String(req.getParameter("number").getBytes("iso-8859-1"), "utf-8");
其实 直接:String number = req.getParameter("number");就可以,但是我的值在传递时中文时乱码,所以加上了
要跳转的页面:
req.setAttribute("list", list);
把一个数据保存到页面(第一个是你在页面要用的list ,第二个是你在servlet中的数据,可以是集合,对象和基本数据)
req.getRequestDispatcher("hello.jsp").forward(req, resp); 跳转页面
数据库:
JDBC连接数据库
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
*
* @ClassName: JDBC
* @Description: 测试与数据库的连接
* @author Anxc
* @date 2019年8月7日
*
*/
public class JDBC {
// 定义一些基础变量
String url = "jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=UTF-8";
String username="root";
String password="password";
private static int id=0;
// 定义私有变量
private PreparedStatement prepareStatement;
private Connection conn;
/**
*
* @Title: getConnection
* @Description: 数据库连接
* @param @return 参数
* @return Connection 返回类型
* @throws
*/
public Connection getConnection() {
try {
// 加载JDBC驱动
Class.forName("com.mysql.jdbc.Driver");
// 获取连接
conn=DriverManager.getConnection(url, username, password);
return conn;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
/**
*
* @Title: addUser
* @Description: 增加用户到数据库
* @param 参数
* @return void 返回类型
* @throws
*/
public void addUser() {
String sql="insert into UserInfo values(?,?,?)";
// 定义添加的用户信息
id++;
String name = "张三";
String pwd = "12";
Connection conn = getConnection();
try {
prepareStatement = conn.prepareStatement(sql);
prepareStatement.setInt(1, id);
prepareStatement.setString(2, name);
prepareStatement.setString(3, pwd);
prepareStatement.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
prepareStatement.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
*
* @Title: deleteUser
* @Description: 删除一个用户信息
* @param 参数
* @return void 返回类型
* @throws
*/
public void deleteUser() {
// 定义SQL语句
String sql="delete from UserInfo where id =?";
Connection conn = getConnection();
try {
// 执行SQL语句
prepareStatement = conn.prepareStatement(sql);
// 替换占位符?
prepareStatement.setInt(1, 1);
// 获取返回结果集
prepareStatement.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
// 关闭数据库连接
prepareStatement.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
*
* @Title: insertUser
* @Description: 修改User
* @param 参数
* @return void 返回类型
* @throws
*/
public void updateUser() {
String sql="update UserInfo set username=? where id=?";
Connection conn = getConnection();
try {
prepareStatement = conn.prepareStatement(sql);
prepareStatement.setString(1, "lll");
prepareStatement.setInt(2, 1);
prepareStatement.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
prepareStatement.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
*
* @Title: selectUser
* @Description: 查询数据
* @param 参数
* @return void 返回类型
* @throws
*/
public void selectUser() {
String sql = "select * from UserInfo";
Connection conn = getConnection();
try {
prepareStatement = conn.prepareStatement(sql);
ResultSet res = prepareStatement.executeQuery();
// 遍历输出
while(res.next()) {
// int id = res.getInt(1);
System.out.println("id:"+res.getInt(1)+"|name:"+res.getString(2)+"|pwd:"+res.getString(3));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
prepareStatement.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
*
* @Title: initTable
* @Description: 删除表的所有数据,使系统运行时id从0开始
* @param 参数
* @return void 返回类型
* @throws
*/
public void initTable() {
String sql = "truncate userInfo";
System.out.println("-----------init-----------");
Connection conn = getConnection();
try {
prepareStatement = conn.prepareStatement(sql);
prepareStatement.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
prepareStatement.close();
conn.close();
System.out.println("-----------ok------------");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
这是我以前写的一个,可以自己理解一下
附录
导入jar包:
jsp文件头报错:
是因为没有配置tomcat:
要导入的jar包:
第一个和第三个是JSTL的包(https://www.runoob.com/jsp/jsp-jstl.html 这教程,里面有安装信息)
第二个是JDBC需要的包(访问数据库) (https://www.runoob.com/java/java-mysql-connect.html 在这里下载jar)
这几个jar包复制到lib文件夹下,然后:
对于用户名是中文的,执行修改和删除功能报错的代码,可以按照以下进行修改:
要修改的文件:
修改后的样子:
如果别的也由于中文的问题出错,可以把下面这几个文件都按照上面的改了:
URL传参中需要处理的特殊字符及方法:
https://blog.csdn.net/loongshawn/article/details/54613310 (还是没解决实际问题)
url特殊字符转义及解决方法(附有例子)
https://blog.csdn.net/u013412790/article/details/51441972 (完美解决关于“%”的问题)
executeQuery返回值如何判断是否有内容:
https://blog.csdn.net/yw_1207/article/details/80832698
JSP传递参数给servlet的三种方法
https://blog.csdn.net/zeephom/article/details/79607173
EL表达式用法
https://www.cnblogs.com/xdp-gacl/p/3938361.html
数据库代码:
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`u_username` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`u_class` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`u_number` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`u_sex` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`u_tel` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`u_username`) USING BTREE
) ;
原码
Github 原码项目:https://github.com/Anxc520/servletProject.git
项目导入步骤:
1.1 新建项目
转2.0
1.2 如果没有Dynamic Web project:
2.0 项目信息
3.0 复制项目
解压下载的项目并打开:
复制红框的两个文件夹到我们刚才2.0 最后打开的文件夹下,然后刷新eclipse项目,运行即可,但是数据库的表要自己新建一下。
jsp+servlet+mysql简单实现用户登陆注册的更多相关文章
- JSP+Servlet+mysql简单示例【图文教程】
下载MYSQL:http://dev.mysql.com/downloads/ 下载安装版的 然后安装(安装步骤就不详细说了) 安装好之后,点击托盘图标,打开管理工具 创建一个数据库 数据库的名字 ...
- jsp+servlet+mysql 实现简单的银行登录转账功能
jsp+servlet+mysql 实现简单的银行登录转账功能 [前期的准备] html(登录界面),servlet(处理业务逻辑),jsp(主要实现界面),mysql(实现与数据库的简单的交互)先从 ...
- JavaWeb基础之Servlet简单实现用户登陆
学习javaweb遇到了一些坑,一些问题总结下来,记个笔记. 学习servlet遇到的一些坑: servlet实现用户登陆遇到的坑解决办法: https://www.cnblogs.com/swxj/ ...
- Java Spring+Mysql+Mybatis 实现用户登录注册功能
前言: 最近在学习Java的编程,前辈让我写一个包含数据库和前端的用户登录功能,通过看博客等我先是写了一个最基础的servlet+jsp,再到后来开始用maven进行编程,最终的完成版是一个 Spri ...
- 用户登陆注册【JDBC版】
前言 在讲解Web开发模式的时候,曾经写过XML版的用户登陆注册案例!现在在原有的项目上,使用数据库版来完成用户的登陆注册!如果不了解的朋友,可以看看我Web开发模式的博文! 本来使用的是XML文件作 ...
- 《java入门第一季》模拟用户登陆注册案例集合版
需求:校验用户名和密码,登陆成功后玩猜数字小游戏. 在这里先写集合版.后面还有IO版.数据库版. 一.猜数字小游戏类: 猜数字小游戏的代码见博客:http://blog.csdn.net/qq_320 ...
- javaweb学习总结(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册
一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...
- JavaWeb学习 (二十一)————基于Servlet+JSP+JavaBean开发模式的用户登录注册
一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...
- 基于Servlet+JSP+JavaBean开发模式的用户登录注册
http://www.cnblogs.com/xdp-gacl/p/3902537.html 一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBea ...
随机推荐
- 解决Android调用相机拍照,要报“打开相机失败”查看debug日志显示“setParameters failed”的问题
使用CameraLibrary项目,在部分手机或平板上不能正常使用,要报“打开相机失败”查看debug日志显示“setParameters failed”. 找到CameraView.java中的se ...
- SpringBoot+Redis简单使用
1.引入依赖 在pom.xml中加入 <dependency> <groupId>org.springframework.boot</groupId> <ar ...
- RHEL/CentOS 安装最新版Nginx
本篇简单介绍如何在RHEL/CentOS安装最新版本的Nginx. Step 1:安装yum-utils [root@localhost ~]# cat /etc/redhat-release Cen ...
- PlayJava Day025
JTable 用JTable类可以以表格的形式显示和编辑数据 JTable类的对象并不存储数据,它只是数据的表现 MVC 数据.表现和控制三者分离,各负其责 M = Model(模型) V = Vie ...
- Hibernate 数据层基类实现
提取经常操作表如新增.修改.删除.查询.分页查询.统计等业务功能,形成基类,用泛型传参,有利于每个实体对象数据层继承. package com.base.dao; import java.io.Ser ...
- CSS3 更改字体被选中样式
CSS3 更改字体被选中样式
- MySQL数据库~~~~~查询行(文件的内容)
1. 单表查询 语法 select distinct 字段 from 库名.表名 where 条件 group by 字段 # 分组 having 筛选 # 过滤 order by 字段 # 排序 l ...
- robotframework框架 - 在Pycharm当中编写RobotFramework测试用例
众所周知,pycharm是个写python极好用的编辑器.也可以装很多的插件来完成各种骚操作. 某一天,心血来潮在pycharm的插件库里,搜索了一下robot,恩,发现有支持robotframewo ...
- 编译出错:must be index or base register
指令 mov ds:[dx],dx 原因:上述指令使用寄存器相对寻址方式,只能使用BX,BP,SI,DI 方括号里必须是变址(index,指SI, DI)或基址(base,指BX, BP)寄存器 正确 ...
- MASMPlus连接出错:error LNK2001: unresolved external symbol _WinMainCRTStartup
坑:汇编语言第三版使用的是masm5.0,网上找到了一个masm32,一看名字,不就是masm的32位版本吗.然也..这是另外一个软件 MASM32并非是指Microsoft的MASM宏汇编器.MAS ...