原码,项目中遇到的错误,解决方法,文章最后有链接可以获取

项目简介

*有的网友说在修改和删除时会触发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简单实现用户登陆注册的更多相关文章

  1. JSP+Servlet+mysql简单示例【图文教程】

    下载MYSQL:http://dev.mysql.com/downloads/ 下载安装版的 然后安装(安装步骤就不详细说了) 安装好之后,点击托盘图标,打开管理工具 创建一个数据库   数据库的名字 ...

  2. jsp+servlet+mysql 实现简单的银行登录转账功能

    jsp+servlet+mysql 实现简单的银行登录转账功能 [前期的准备] html(登录界面),servlet(处理业务逻辑),jsp(主要实现界面),mysql(实现与数据库的简单的交互)先从 ...

  3. JavaWeb基础之Servlet简单实现用户登陆

    学习javaweb遇到了一些坑,一些问题总结下来,记个笔记. 学习servlet遇到的一些坑: servlet实现用户登陆遇到的坑解决办法: https://www.cnblogs.com/swxj/ ...

  4. Java Spring+Mysql+Mybatis 实现用户登录注册功能

    前言: 最近在学习Java的编程,前辈让我写一个包含数据库和前端的用户登录功能,通过看博客等我先是写了一个最基础的servlet+jsp,再到后来开始用maven进行编程,最终的完成版是一个 Spri ...

  5. 用户登陆注册【JDBC版】

    前言 在讲解Web开发模式的时候,曾经写过XML版的用户登陆注册案例!现在在原有的项目上,使用数据库版来完成用户的登陆注册!如果不了解的朋友,可以看看我Web开发模式的博文! 本来使用的是XML文件作 ...

  6. 《java入门第一季》模拟用户登陆注册案例集合版

    需求:校验用户名和密码,登陆成功后玩猜数字小游戏. 在这里先写集合版.后面还有IO版.数据库版. 一.猜数字小游戏类: 猜数字小游戏的代码见博客:http://blog.csdn.net/qq_320 ...

  7. javaweb学习总结(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册

    一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...

  8. JavaWeb学习 (二十一)————基于Servlet+JSP+JavaBean开发模式的用户登录注册

    一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...

  9. 基于Servlet+JSP+JavaBean开发模式的用户登录注册

    http://www.cnblogs.com/xdp-gacl/p/3902537.html 一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBea ...

随机推荐

  1. idea上传项目到github

    1.在上传项目之前需要先在idea中确认两个配置,一个是git的执行位置,电脑上没有安装git的需要提前安装(下载git软件并且安装,非github desktop),安装之后再idea的settin ...

  2. MPV源码探究:源码结构和调用层次

    源码结构和调用层次 源码结构 从 Github 上拉取最新的源码,目录结构大致如下: H:\MPV ├─.github ├─audio │ ├─decode │ ├─filter │ └─out ├─ ...

  3. WebMvcConfigurationSupport 避坑指南

    通过返回WebMvcConfigurationSupport 的方式, 默认会覆盖 Spring boot的自动配置, 导致配置失效静态资源无法访问:但是在WebMvcConfigurationadp ...

  4. NLP入门(十一)从文本中提取时间

      在我们的日常生活和工作中,从文本中提取时间是一项非常基础却重要的工作,因此,本文将介绍如何从文本中有效地提取时间.   举个简单的例子,我们需要从下面的文本中提取时间: 6月28日,杭州市统计局权 ...

  5. weed3-2.1.开始纯java使用

    Weed3 一个微型ORM框架(只有0.1Mb哦) 源码:https://github.com/noear/weed3 源码:https://gitee.com/noear/weed3 纯java使用 ...

  6. Java题库——Chapter14 JavaFX基础

    Chapter 14 JavaFX Basics Section 14.2 JavaFX vs Swing and AWT1. Why is JavaFX preferred?a. JavaFX is ...

  7. windows 本地链接 VMware虚拟机 redis服务

    使用本地Windows链接 VMware虚拟机 redis服务 我用的虚拟机系统是:windows Server 2012 先把Redis服务器拷贝到服务器并解压,目录如下 这里仅仅作为演示,所以就不 ...

  8. vuejs中拖动改变元素宽度实现宽度自适应大小

    需求效果: 原理:拖动效果的实现基本都是dom操作来实现的,通过拖动分隔线,计算分隔线与浏览器边框的距离(left),来实现拖动之后的不同宽度的计算:当拖动分隔线1时,计算元素框left和mid:当拖 ...

  9. vue应用调试工具 vue-devtools安装

    方法一:chrome直接访问下面地址下载安装:(需要翻墙) https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejigli ...

  10. vue render函数解析

    一.render 函数的作用: 写一些vue.js的template太繁琐,利用render,可以使用js来生成模板,更加灵活和简便. 二.使用render前提: 官网也说了.在深入渲染函数之前推荐阅 ...