Servlet总结

简单的登录案例(Servlet)

Servlet学过后忘的太快了,所以,写一篇文章记录一下。下一次自己再忘了,还能再看看。这里复习的是一个简单的登录案例,顺便把JDBC复习一下。主要复习JDBC的JdbcTemplate、和druid连接池。

简单的登录案例实现步骤:

1.创建一个Maven项目

我们这里选的是带模版的Maven项目:

image-20200722205716389

记得一定要选好本地仓库哦~

不然Finsh会创建很慢的哦~

image-20200722205807623

如果在你的创建界面没有出现选择Maven仓库位置,请在下图找取:

image-20200722211509870

当然,要是没学习过Maven…你还是学一下吧,挺重要的…

2.pom.xml文件中需要导入依赖:JdbcTemplate、和druid连接池依赖、servlet依赖、junit依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.20</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.mchange/mchange-commons-java -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>mchange-commons-java</artifactId>
<version>0.2.15</version>
</dependency>
</dependencies>

打开你的Maven,如果这里不暴红,那就说明你导入的依赖很成功。

在这里插入图片描述

3.创建数据库,和SQL语句

这里只是演示如何实现登录案例,所以表较为简单。

就是一个名为user的表,里面只有username和password两个属性。这个建表语句大家应该都会,所以就不再阐述了。

image-20200722212702111

4.创建dao层的包和servlet层的包

在这里插入图片描述

5.先写dao层的代码

1.首先创建一个User类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package main.liu.dao;

public class User {
private String username;
private String password;

public User() {
}

@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}

public User(String username, String password) {
this.username = username;
this.password = password;
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}
}

2.写一个properties文件用来放关于连接数据库的

在这里插入图片描述

jdbc.properties的内容

1
2
3
4
5
6
7
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///db_student?useSSL=false&useUnicode=true&characterEconding=UTF-8
username=root
password=131411
initialSize=5
maxActive=10
maxWait=3000

3.编写一个JDBC工具类:JDBCUtils

工具类一般都会写在一个包中,在dao层下创建一个utils包,写下如下代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package main.liu.utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class JDBCUtils {
private static DataSource ds;
static {
try {
Properties properties=new Properties();
properties.load(JDBCUtils.class.getClassLoader().getResourceAsStream("jdbc.properties"));
ds= DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}

//获取连接池方法
public static DataSource getDataSource(){
return ds;
}
//获取连接方法
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
//释放资源
public static void close(Statement statement, Connection connection){
close(null,statement,connection);
}
public static void close(ResultSet resultSet, Statement statement, Connection connection){
if (resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement!=null){
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection!=null){
try {
statement.close();//归还
} catch (SQLException e) {
e.printStackTrace();
}
}
}

}

4.编写一个UserDao接口

为什么要编写接口呀?

DAO接口
为每个DAO声明接口的好处在于:

  1. 可以在尚未实现具体DAO的时候编写上层代码,如Service里对DAO的调用。
  2. 可以为DAO进行多实现,例如有JDBCDAO实现,MyBatisDAO实现,而不需要更改上层代码。
1
2
3
4
5
6
7
8
package main.liu.dao;

import java.sql.SQLException;

public interface UserDao {
User findByNamePassword(User loginUser) throws SQLException;
}

5.有了接口肯定要有实现类呀

实现类一般是在和UserDao处于同一级的一个目录Impl下。

所以,在dao层下建立一个Impl包。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package main.liu.dao.Impl;
import main.liu.dao.User;
import main.liu.dao.UserDao;
import main.liu.utils.JDBCUtils;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

import java.sql.SQLException;

public class UserDaoImpl implements UserDao {
//声明JDBCTemplate共用

@Override
public User findByNamePassword(User loginUser) throws SQLException {
try {
JdbcTemplate template=new JdbcTemplate(JDBCUtils.getDataSource());
//1.编写sql
String sql="select * from user where username=? and password=?";
//2.调用query方法
User user = template.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), loginUser.getUsername(), loginUser.getPassword());
return user;
} catch (DataAccessException e) {
e.printStackTrace();
return null;
}
}
}

6.功能已经齐全,那测试一下啊!

在dao层创建一个test包,test包内创建一个test类进行测试一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main.liu.Test;
import main.liu.dao.Impl.UserDaoImpl;
import main.liu.dao.User;
import org.junit.Test;
import java.sql.SQLException;
public class UserDaoTest {
@Test
public void Test1() throws SQLException {
User user=new User();
user.setUsername("刘畅");
user.setPassword("131411");
UserDaoImpl userDao = new UserDaoImpl();
User user1 = userDao.findByNamePassword(user);
System.out.println(user1);
}
}

image-20200722221209721

测试成功后我们就开始编写servlet层的代码

6.编写servlet层代码

1.配置Tomcat运行环境

在这里插入图片描述

2.编写一个登录页面

这就是index.jsp的代码,这是展示了两个输入框和一个提交按钮。

注意:这是jsp文件。你会发现,你用Maven创建后在webapp/WEB-INF/index.jsp并没有下面代码的第一行<%@ page contentType="text/html;charset=UTF-8" language="java" %>。请注意,必须把这一句加上,不然tomcat识别不了这个jsp。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>表单提交</title>
</head>
<body>
<form action="/Servlet_01_war/LoginServlet" method="post">
<input name="username" placeholder="请输入用户名"><br/>
<input type="text" name="password" placeholder="请输入密码"><br/>
<input type="submit" value="提交">
</form>
<a href="/Servlet_01_war/LoginServlet">Servlet01</a>
</body>
</html>

3.创建servlet类

主要实现,当表单提交后跳转到LoginServlet,在LoginServlet中判断用户名和密码是否正确,如果不正确就跳转到defaultServlet类,如果成功就跳转到SuccessServlet类。

1.首先创建一个LoginServlet类

在这里插入图片描述

LoginServlet代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package main.liu.servlet;

import main.liu.dao.Impl.UserDaoImpl;
import main.liu.dao.User;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.sql.SQLException;

@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
//设置编码
request.setCharacterEncoding("utf-8");
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
//创建userDao对象
UserDaoImpl userDao = new UserDaoImpl();
//从表单获取提交信息usernaem和password
String username = request.getParameter("username");
String password = request.getParameter("password");
//把提交的信息放在共享里,好在defaultServlet、SuccessServlet中获取
request.setAttribute("username",username);
request.setAttribute("password",password);
//创建User对象,将username和password用set传进去
User user=new User();
user.setUsername(username);
user.setPassword(password);
try {
//调用userDao的方法来查询
User user1 = userDao.findByNamePassword(user);
System.out.println(user.getUsername());
System.out.println(user.getPassword());
//在dao层,我们能查到就返回user,如果没有就返回null,所以在这里判断是否为空值来代替是否用户名密码正确
//如果不为空,就跳转到SuccessServlet
if (user1!=null){
RequestDispatcher dispatcher = request.getRequestDispatcher("/SuccessServlet");
dispatcher.forward(request,response);
}else {
//如果为空就跳转到defaultServlet
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/defaultServlet");
requestDispatcher.forward(request,response);
}
} catch (SQLException e) {
e.printStackTrace();
} catch (ServletException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
2.defaultServlet
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main.liu.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/defaultServlet")
public class defaultServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
response.getWriter().print("登录失败,用户名或密码错误!!!");
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}

3.SuccessServlet
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main.liu.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/SuccessServlet")
public class SuccessServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Object username = request.getAttribute("username");
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
response.getWriter().print("欢迎用户"+username+"大降光临!!!");
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}

7.OK,跑一下看看

在这里插入图片描述

点击查看
-------------------本文结束 感谢您的阅读-------------------