代码目录
首先,项目目录结构和描述如下:
1.准备:
在使用Servlet之前,请确保导入了mysql的jar包和servlet的jar包,并放在wepcontent的lib下面
已经在tomcat里面布置好服务器配置了。如果没有配置请参考nanfengnan的上一篇博客:https://www.cnblogs.com/nanfengnan/p/13825922.html
如果没有servlet选项请看:https://www.cnblogs.com/nanfengnan/p/13825924.html
2.项目概述,为什莫写这末多包主要是为了实现隔离和好管理 当然还有设计模式的事情(当然小编此时才大三 哈哈,刚回一点一点设计模式就不献丑了)
com.DAO包:是实现数据库操作的包,(里面写入从数据库里面读数据的方法)直接和数据库交互的包
com.pojo包:因为要和数据库交互,要有数据库实例,里面是数据库的属性
com.service包:是实现接受前端传来的字段,并构造要查询sql语句和调用com.DAO包里面的方法,实现和数据库交互的中间层。
com.Servlet包:是servlet,里面是用来接受html传来的表单的操作,并返回在页面上提示信息,准则让每个servlet实现一个相应的操作(实际开发中),如登录用一个servlet线程,注册用一个servlet线程。
com.utils包:用来存工具的包,如取得数据库链接对象的类
login.html:登陆主页
注意servlet1,servlet没有用,那是我的练习
相应包里面的类和代码
3.废话不多说,直接上代码
3.1com.DAO包
//这是com.DAO包里面的类
package com.DAO;
//数据库的操作 要把数据库的操作和具体前端操作都分隔开
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import com.pojo.User;
import com.utils.*;
public class UserDAO {
public ArrayList findUserBySql(String sql) {
//存用户的列表
ArrayList<User> userList=new ArrayList<User>();
//数据库操作
GetConnection getConnection = new GetConnection();
Connection conn=getConnection.getConn();
try {
Statement state=conn.createStatement();
ResultSet result=state.executeQuery(sql);
System.out.println("数据查询中......");
System.out.println("sql语句为:"+sql);
while(result.next()) {
User u =new User();
u.setId(result.getInt("id"));
u.setUsername(result.getString("username"));
u.setPassword(result.getString("password"));
userList.add(u);
}
state.close();
conn.close();
}
catch (Exception e) {
e.printStackTrace();
}
return userList;
}
}
3.2com.pojo包
package com.pojo;
//实体类 数据库的实体对象类
public class User {
private int id;
private String username;
private String password;
public int getId()
{
return id;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public void setId(int id) {
this.id=id;
}
public void setUsername(String username) {
this.username=username;
}
public void setPassword(String password) {
this.password=password;
}
}
3.3
package com.service;
import java.io.PrintWriter;
import java.util.ArrayList;
import com.DAO.UserDAO;
import com.pojo.User;
//具体业务方法 登录从后台取出用户名和密码 组成一个用户送到前端
public class userService {
// 因为要调用userDAO里面的方法,所以先建立一个对象
UserDAO ud = new UserDAO();
public User login(String name, String pwd) {
// 前端表单输入用户名和密码,让后调用方法判断数据库里面有没有这一个记录,有的话传回前端
// 没有的话,登陆失败
User u = null;
// 构造要查询的sql语句
String sql = "select * from user where username='"+name+"' and password='"+pwd+"' ";
ArrayList<User> userList = ud.findUserBySql(sql);
if (userList.size() > 0) {
// 用户数量大于零,说明里面有用户,登陆成功,返回给前台用户对象
u = userList.get(0);
System.out.println("找到了");
}
// 否则没找到用户对象返回空null
System.out.println("查询服务结束");
return u;
}
}
3.4com.service包
package com.Servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.pojo.User;
import com.service.userService;
public class servlet2 extends HttpServlet {
//实际开发中每个servlet对应一个功能,登录用登录的servlet,注册用注册的servlet
userService us=new userService();
//获取表单数据 模拟登录 login.html
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求参数
request.setCharacterEncoding("GBK");//设置请求编码格式
response.setCharacterEncoding("GBK");//设置响应的编码格式
String name=request.getParameter("uname");//得到请求参数name(地址栏输入的)
String passwd=request.getParameter("upwd");
PrintWriter pw = response.getWriter();
if(name!=null && passwd!=null) //防止空指针异常
{
User u=us.login(name, passwd);
if (u!=null) {
pw.print("恭喜你!"+u.getUsername()+"登陆成功");
}
else {
pw.println("用户名或密码错误,请重新输入");
}
}
else {
pw.println("输入的用户名或密码为空!");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
doGet(request, response);
}
}
3.5com.utils包
package com.utils;
import java.sql.*;
//工具包
//返回数据库连接对象
public class GetConnection {
private Connection conn=null;
private static String url="jdbc:mysql://localhost:3306/java?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true";
private static String name="root";
private static String passwd="20003234fenglei";
public Connection getConn()
{
if(conn==null) {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(url,name,passwd);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("连接失败!");
}
}
return conn;
}
}
3.6 webcontent下面的web-xml配置成如下,如果没有的话,百度一下很简单的
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>web3</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>servlet2</servlet-name>
<servlet-class>com.Servlet.servlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet2</servlet-name>
<url-pattern>/servlet2</url-pattern>
</servlet-mapping>
</web-app>
3.7login.html 登录主页 这个html代码大家可以自己添加操作,在后台补上相应操作即可
<!DOCTYPE html>
<html>
<head>
<meta charset="GBK">
<title>用户登录</title>
</head>
<body>
<form action="http://127.0.0.1:8080/web3/servlet2" method="post">
用户名:<input type="text" name="uname"><br>
密码:<input type="password" name="upwd">
<input type="submit">
</form>
</body>
</html>
总结:可去我的博客里面找到在java-web下面有解决办法
常用报错:
1.com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed. 错误
2.此Web应用程序实例已停止。无法加载[]。为了调试以及终止导致非法访问的线程,将抛出以下堆栈跟踪。 这个问题是因为最开始我把连接的方法和变量定义成静态static的了,只能访问一次,下一次访问就找不到线程了。