我们要是实现的是一个在tomcat容器上运行的servlet程序。tomcat负责处理客户请求,将请求传送给serlet,并将servlet的响应传送给客户端。即客户在登陆界面中输入用户,密码,并将其呈递上后,tomcat将客户输入的用户名和密码传递给servlet程序。servlet程序调用数据库中的用户列表与其对比。如果,用户名和密码存在,则登陆页面转向登陆成功页面,否则则转入登录界面。
server Applet(servlet)使用java编写的服务端程序。其主要功能在于交互式地浏览和修改数据,生成动态web内容。一般servlet指的是任何实现了servlet接口的类。
Tomcat服务器是个web应用服务器。不像Apache只支持静态网页,tomcat能够处理asp,php,cgi,jsp等动态网页。
一、创建一个Dynamic web project
可以自行到tomcat官网中下载tomcat。打开eclipse创建一个Dynamic web project。
选择运行环境(new server runtime environment),apache tomcat v8.0
完成后,就可以在project explorer中看到我们新建的dynamic java project了
二、配置tomcat服务器
在project->properties(工程属性)->java build path添加library。
然后添加一个tomcat服务器
Add 刚才新建的login工程
完成后,我们可以再project explorer中看到,我们添加成功的tomcat服务器
二、编写登录界面,成功登陆界面
在login工程中的webcontent目录,新建一个login.jsp文件作为登陆页面,新建一个文件夹admin在里面新建一个success.jsp文件作为登陆成功页面。
在login.jsp中,编写输入用户名字、密码和递交按钮的页面,运行一下,可以看一个很简陋的登陆的页面了。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>login</title>
</head>
<body>
<form>
<input type="text" name="username"><br>
<input type="password" name="password"><br>
<input type="submit" name="submit" value="submit">
</form>
</body>
</html>
success.jsp中只要提示登陆成功即可(假如要显示中午,需要修改字符编码)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
登陆成功!
</body>
</html>
三、编写servlet处理客户请求,并返回相应的响应
在java resource 中src源代码文件中,新建一个servlet java服务端程序
在post方法中编写处理用户请求的代码
package com.login;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class LoginAction
*/
@WebServlet("/LoginAction")
public class LoginAction extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public LoginAction() {
super();
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
/**
* Description:
* 判断用户名和密码是否正确,正确则将页面转向登陆成功页面,否则重新打开登陆页面
*
* @param request
* @param response
*
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取客户递交的用户名和密码
String userName = request.getParameter("username");
String password = request.getParameter("password");
//假如用户名和密码符合,则转入登陆成功页面,否则重新打开登陆页面
if(userName.equals("lee")
&&password.equals("123456")){
request.getRequestDispatcher("admin/success.jsp").forward(request, response);
}else{
request.getRequestDispatcher("login.jsp").forward(request,response);
}
}
}
改写login.jsp登陆页面中的表单(< form>< /form >)
<form action="LoginAction" method="post">
<input type="text" name="username"><br>
<input type="password" name="password"><br>
<input type="submit" name="submit" value="submit">
</form>
运行login.jsp页面,我们就可以看到输入正确的用户名和密码就能成功转入登陆成功页面。
四、连接数据库
通常网站会将用户信息储存在数据库中。当用户登陆时,则需要连接上数据库并在数据库中查询是否存在相应的用户名。存在该用户时,则取出密码并与客户端提交的密码相对比。
我们先编写一个连接数据库的类。
导入mysql-connector-java-5.1.40-bin.jar包
在数据库中,创建用户列表
创建属性文件
相应的代码:
package com.mysql;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
import java.io.File;
/**
* Description:
* 连接数据库的一个类。
*
* @author Lee
* */
public class JDBCUtil {
/**
* Description:
* 获取一个数据库连接
*
* return conn 数据的连接
* */
public static Connection getConnection(){
Connection conn = null;
Properties prop = new Properties();
try{
//File test = new File(".");
//System.out.println(test.getAbsolutePath());
//加载属性文件
prop.load(new FileInputStream("C:\\Users\\lenovopc\\workspace\\login\\WebContent\\WEB-INF\\lib\\param.properties"));
//根据字符串获得相应的类的对象
Class.forName(prop.getProperty("driver"));
//获取数据库连接
conn = DriverManager.getConnection(
prop.getProperty("url"),
prop.getProperty("userName"),
prop.getProperty("pass"));
}catch(IOException e){
e.printStackTrace();
}catch(ClassNotFoundException e){
e.printStackTrace();
}catch(SQLException e){
e.printStackTrace();
}
return conn;
}
/**
* Description:
* 跟用户名来获取用户的密码,假如数据库中没有此用户,则返回null
*
* @param username 用户名字
* @return password 返回用户的密码
* */
public static String getPasswordByUsername(String username){
String password = null;
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try{
conn = getConnection();
stmt = conn.createStatement();
//执行mysql查询语句
rs = stmt.executeQuery
("select password from user where username = '"+username+"'");
//获取用户密码
while(rs.next()){
password = rs.getString(1);
}
}catch(SQLException e){
e.printStackTrace();
}
return password;
}
public static void main(String[] args){
System.out.println(JDBCUtil.getPasswordByUsername("lee"));
}
}
*附记:
注意properties文件的路径(需要绝对路径),因为,java application和tomcat服务器上运行的路径上是不一样的。*
五、修改相应的servlet的doPost代码块
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取客户递交的用户名和密码
String userName = request.getParameter("username");
String password = request.getParameter("password");
//假如用户名和密码符合,则转入登陆成功页面,否则重新打开登陆页面
if(userName!=null
&&JDBCUtil.getPasswordByUsername(userName)!=null
&&JDBCUtil.getPasswordByUsername(userName).equals(password)){
request.getRequestDispatcher("admin/success.jsp").forward(request, response);
}else{
request.getRequestDispatcher("login.jsp").forward(request,response);
}
}
可以看到输入正确的用户名的密码就能,成功转入登陆成功页面。
附记:
那么问题来了,我在数据库工具类中调用了个存有数据库的driver,url,username,password的peoperties文件,因为两种运行相对路径的不一样,所以加载properties的路径是需要写上绝对路径的。