1、数据表结构与内容
2、代码实现
注意:
(1)表单的提交地址为“lgServlet”。这在我们之后的Servlet的配置中需要用到。
(2)提交的方式是“post”方式。这决定了调用Servlet的哪个方法。
(3)2个文本框控件的name属性为“username”、“password”。这
(4)我们还需要2个简单的成功"result_succ.jsp"、登陆失败"result_err.jsp"画面
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>login</title>
</head>
<body>
<form action="lgServlet" method="post">
用户名:<input type="text" name="username"/>
密 码:<input type="password" name="password"/>
<input type="submit" value="登录"/>
</form>
</body>
</html>
result_err.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>error</title>
</head>
<body>
<p>${info}</p>
<%
PrintWriter pat = response.getWriter();
pat.println("<html>");
pat.println("<head>");
pat.println("<body>");
pat.println("<a href='./login.jsp'>返回</a>");
pat.println("</body>");
pat.println("</head>");
pat.println("</html>");
%>
</body>
</html>
result_succ.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>result</title>
</head>
<body>
<p>${info}</p>
</body>
</html>
DbPreparedUtil.java
package com.example.MVC_test;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DbPreparedUtil {
private Connection connection;
private PreparedStatement statement;
/**
* 初始化和获取connection
* @return
* @throws Exception
*/
public Connection getConnection() throws Exception{
if (this.connection==null){//赋值
Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("成功执行第一步");
//第二步,获取连接
this.connection=
DriverManager.getConnection(
"jdbc:mysql://localhost:3306/testdb?serverTimezone=UTC",
"root",
"123456");
System.out.println("成功执行第二步");
}
return this.connection;
}
/**
* 初始化和获取statement
* @return
* @throws Exception
*/
public PreparedStatement getStatement(String sql)
throws Exception{
this.closeStatement();
if(this.statement==null){
this.statement=
this.getConnection().prepareStatement(sql);
}
return this.statement;
}
/**
* 执行查询的方法
* @param sql
* @return
* @throws Exception
*/
public List executeQuery(String sql, Object...parameters) throws Exception{
PreparedStatement statement=this.getStatement(sql);
int index=1;
for(Object param:parameters){
statement.setObject(index,param);
index++;
}
ResultSet rs=statement.executeQuery();
List res=this.getResult(rs);
rs.close();
this.closeStatement();
System.out.println("成功执行第三步");
return res;
}
/**
* 执行更新,插入,删除的方法
* @param sql
* @return
* @throws Exception
*/
public int executeUpdate(String sql,Object...parameters) throws Exception{
PreparedStatement statement=this.getStatement(sql);
int index=1;
for(Object param:parameters){
statement.setObject(index,param);
index++;
}
System.out.println("成功执行第四步");
return statement.executeUpdate();
}
/**
* 关闭statement
*/
public void closeStatement() throws Exception{
if(this.statement!=null){
this.statement.close();
this.statement=null;
}
}
/**
* 关闭连接
*/
public void close() throws Exception{
try {
this.closeStatement();
}catch (Exception e){
e.printStackTrace();
}
if(this.connection!=null){
this.connection.close();
}
System.out.println("成功执行第五步");
}
/**
* 讲resultset转化为list
* @param rs
* @return
*/
public List getResult(ResultSet rs)throws Exception{
ResultSetMetaData metaData=rs.getMetaData();
List trs=new ArrayList();
while (rs.next()){
Map temp=new HashMap();
for(int i=1;i<=metaData.getColumnCount();i++){
String key=metaData.getColumnName(i);
Object val=rs.getObject(i);
temp.put(key,val);
}
trs.add(temp);
}
return trs;
}
}
Model.java
package com.example.MVC_test;
import java.util.List;
public class Model {
public List selectUserWithUtil(String username) throws Exception{
DbPreparedUtil dbPreparedUtil = new DbPreparedUtil();
String sql = "select * from username_pwd where username=?";
try {
List res = dbPreparedUtil.executeQuery(sql,username);
return res;
}catch (Exception e){
e.printStackTrace();
}finally {
try {
dbPreparedUtil.close();
}catch (Exception e){
e.printStackTrace();
}
}
return null;
}
}
LoginServlet.java
package com.example.MVC_test;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;
public class LoginServlet extends HttpServlet {
@Override
public void init() throws ServletException {
super.init();
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException{
// 设置中文字符集
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
// 获取表单提交的元素
String username = req.getParameter("username");
String password = req.getParameter("password");
// 调用Model
Model model = new Model();
List users = null;
try {
users = model.selectUserWithUtil(username);
if(users==null||users.isEmpty()){
req.setAttribute("info","用户不存在");
req.getRequestDispatcher("result_err.jsp").forward(req,resp);
}else if(users.size()>1){
req.setAttribute("info","用户存在多条");
req.getRequestDispatcher("result_err.jsp").forward(req,resp);
}else{
Map user = (Map)users.get(0);
String dbUserName = (String)user.get("username");
System.out.println("该用户输入的用户名和密码:"+user);
System.out.println("数据库中获取到的该用户的用户名:"+dbUserName);
String dbUserPwd = (String)user.get("pwd");
System.out.println("数据库中获取到的该用户的用户密码:"+dbUserPwd);
// 当用户名和密码都相等是登成功
if(dbUserName.equals(username)&&dbUserPwd.equals(password)){
req.setAttribute("info","登录成功");
req.getRequestDispatcher("result_succ.jsp").forward(req,resp);
}else{
req.setAttribute("info","密码出错了");
req.getRequestDispatcher("result_err.jsp").forward(req,resp);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
需要注意的是在LoginServlet类中通过String dbUserPwd = (String)user.get(“pwd”);获取数据表中该用户的密码时,数据表中pwd的类型必须是varchar型,不能是整型(int),否则即使输入正确的用户名名和密码也会应该类型错误导致登录不成功。
web.xml中的配置
<servlet>
<servlet-name>mvc_res</servlet-name>
<servlet-class>com.example.MVC_test.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>mvc_res</servlet-name>
<url-pattern>/lgServlet</url-pattern>
</servlet-mapping>