先整点专业的。
概念:
(1)Servlet(Server Applet),全称Java Servlet。是用Java编写的服务器端程序,其主要功能在于交互式地浏览和 修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个 Servlet接口的类,一般情况下,人们将Servlet理解为后者。
(2) Servlet运行于支持Java的应用服务器中。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下 Servlet只用来扩展基于HTTP协议的Web服务器。
Servlet就是个服务器程序,写这个就是写个服务器程序,要运行在服务器中,服务器就是tomcat,IBM WebSphere 这种东西。
所以流程就是①整个服务器
②写Servlet的代码,写客户端的代码,然后再让Servlet和客户端交互
③连接数据库,与服务器进行交互
(3) Servlet工作模式:
① 客户端发送请求至服务器
② 服务器启动并调用Servlet,Servlet根据客户端请求生成响应内容并将其传给服务器
③ 服务器将响应返回客户端
例子:
- ①客户端给服务器发个消息,克里斯开下门
- ②服务器让servlet开门,servlet问客户端要干嘛,客户端说你把卢本伟叫出来,然后servlet就告诉服务器说客户端要卢本伟
- ③然后服务器把卢本伟给了客户端。
很好,那么我们已经掌握了servlet是什么了,
并且知道servlet怎么运作了,
那么我们来写个ez的项目。
需求:登录
非常简单的需求,无非就是要以下东西。
- 一个网页,来让用户输入账号密码。
- 一个服务器来运行servlet
- 一个数据库来存数据
- 一个简单的业务逻辑,验证账号密码。
根据让卢本伟开门的流程,这个需求的流程如下
- 用户输入账号密码点登录
- 服务器接收到账号密码。
- 服务器把账号密码传入数据库查询
- 数据库向返回查到了或是没查到
- 服务器向网页返回登陆成功或是没成功
还有几点必须的但可以轻易的找到教程的东西。
①配置服务器,我用的tomcat。
②下载数据库,我用的MySQL。
③掌握jdbc的知识。
④配置servlet。
如果不知道jdbc是啥的话,可以先面向百度。
准备就绪了后我们先来整个前端的页面。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>登录</h1>
<form action="/login" method="post">
username:<input type="text" name="uname"><br>
password:<input type="password" name="upass"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
页面就长这个样子。
然后我们写个数据库的驱动,让服务器和数据库连在一起。
package com.jzl.web;
import java.sql.Connection;
import java.sql.DriverManager;
public class DBConnection {
private static final String driver = "com.mysql.jdbc.Driver";// 数据库驱动,这个直接抄
private static final String url = "jdbc:mysql://localhost:3306/jzl"; //"jzl"是指我的数据库的库名 3306是端口,这个不能直接抄,要看一下
private static final String username = "root"; // 数据库用户名
private static final String password =""; // 数据库密码,我没有密码,直接空字符就行了
private static Connection conn = null; // 连接对象
// 静态代码块加载数据库驱动,这里直接抄
static {
try {
Class.forName(driver);
} catch (Exception e) {
e.printStackTrace();
}
}
// 返回数据库连接对象,直接抄
public static Connection getConnection() throws Exception {
if (conn == null) {
conn = DriverManager.getConnection(url, username, password);
return conn;
}
return conn;
}
//这里验证一下,看看conn连上了没。
public static void main(String[] args) {
try {
Connection conn = DBConnection.getConnection();
if (conn != null) {
System.out.println("数据库连接正常");
} else {
System.out.println("数据库连接异常");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
驱动写好了,我们先不写服务器和前端页面怎么操作,先写服务器和数据库互动代码。
package com.jzl.web;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class LoginCheck {
//定义全局变量,别问我为什么,直接抄
//给返回给服务器的变量赋值个false,能登陆,还是不能登录。
boolean returnValue = false;
//给数据库查询语句赋值
String sql = "SELECT * FROM user";
//下面三个懂的都懂,不懂就直接抄,实在想弄懂百度一下批处理
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
//验证账号密码的,传入账号密码。
public boolean LoginSuccess(String username, String password) throws Exception {
//连接数据库。
try {
//这里连接了
conn = DBConnection.getConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
//当rs能找到下一行就找,找不到就返回一开始我们设置的那个变量,是个null
while (rs.next()) {
String userName = rs.getString("username");
String passWord = rs.getString("password");
if (userName.equals(username) && passWord.equals(password)) {
// 如果用户名和密码都和数据库的一样,就返回true
returnValue = true;
break;
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return returnValue;
}
//关闭两个连接的方法,懂的都懂,不懂就直接抄。
public void shut() {
try {
rs.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
try {
stmt.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
OK,现在我们已经做好了数据库和服务器的连接,我们再来写服务器的程序。
package com.jzl.web;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//处理get请求,直接抄
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//处理post请求
//这个是处理编码的,别问问就是无脑utf-8,嗯记就行了
req.setCharacterEncoding("utf-8");
//1.接收参数 getParameter方法可以根据表单组件名获取提交的数据,下面的uname,upass就是名字,在html的代码里有,
//别直接抄,你先看一下你的表单组件名
String uname = req.getParameter("uname");
String upass = req.getParameter("upass");
System.out.println("uname="+uname+",upass="+upass);
// 构建登陆对象
LoginCheck db = new LoginCheck();
// 取得用户名和密码
boolean canLogin = false;
try {
//这个方法还记不记得,前面写的那个类的第一个方法,返回布尔的
canLogin = db.LoginSuccess(uname, upass);
} catch (Exception e) {
e.printStackTrace();
}
// 根据登陆情况,跳转页面,页面想展示的内容可以写一个html来展示。
if (canLogin) {
System.out.println("用户名和密码正确");
req.getRequestDispatcher("/success.html").forward(req,resp);
db.shut();
} else {
req.getRequestDispatcher("/error.html").forward(req, resp);
System.out.println("用户名和密码错误");
db.shut();
}
}
@Override
public void destroy() {
System.out.println("销毁方法");
}
@Override
public void init() throws ServletException {
}
}
可能出现的问题
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
直接把你的mysql的jar包丢到tomcat的lib文件夹里。
需要改xml配置文件,来不及解释了,看不懂就硬抄吧。
由上至下
1.你想起的名字
2.你的class文件所在地
3.重复输入名字
4.表单名
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>loginServlet</servlet-name>
<servlet-class>com.jzl.web.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>loginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
</web-app>
数据库部分太简单了,具体步骤掠过,直接建个库创个user表添加账号密码就行了。
这玩意一定要先把思路弄对,先想清楚要做什么,然后再去做,一边做一边想人容易崩溃。