原码,项目中遇到的错误,解决方法,文章最后有链接可以获取
项目简介
功能描述
登陆,注册,用户一览表,修改,删除,添加,模糊查询和精确查询
采用的技术及环境
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