通过一个注册登录的小例子,不使用任何框架,采用三层程序的架构,基于MVC的模式,来熟悉一下JSP+Servlet+JavaBean的使用
架构设计:
代码实现:
模型:beans包和DAO包
视图:jsp页面
控制器:servlets
1.先在eclipse建立一个LoginMaven项目,maven项目升级到4.0,jdk用的1.8版本
需要用到MYSQL数据库,maven项目需要在pom.xml下添加数据库依赖
<!-- MySql Connector -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.45</version>
</dependency>
2.这个例子只需要一张users表就可以进行测试,数据库名为testdb
3.这是一个beans包
package beans;
public class Users {
int id;
String username;
String password;
//set、get
}
4.接下来dao包存放与数据库相关操作
package dao;
import java.sql.*;
import beans.User;
public class UserDAO {
public static final String DRIVER = "org.gjt.mm.mysql.Driver";// 驱动
public static final String DBURL = "jdbc:mysql://localhost:3306/testdb";// 连接字符串
public static final String DBUSER = "root";// 用户名
public static final String DBPASS = "123456";// 密码
// 三个对象
private Connection conn = null;
private PreparedStatement pStat = null;// PreparedStatement可实现带参数的动态查询
private ResultSet rs = null;// 结果集
public Connection getConnectionn() {
// 获得数据库连接
try {
Class.forName(DRIVER).newInstance();// 加载mysql驱动
return DriverManager.getConnection(DBURL, DBUSER, DBPASS);// 建立数据库连接
} catch (Exception e) {
return null;
}
}
// 关闭数据库连接
public void close() {
try {
if (rs != null)
rs.close();
if (pStat != null)
pStat.close();
if (conn != null)
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
} // end close
//
public boolean isUsernameExists(String username) {
// 判断用户名是否存在
conn = getConnectionn();
try {
pStat = conn.prepareStatement("select * from users where username=?");
pStat.setString(1, username);// 参数1代表第一个‘?’查找对应参数username
rs = pStat.executeQuery();
if (rs.next())
return true;
else
return false;
} catch (Exception e) {
return false;
} finally {
close();
}
}// end exits
public boolean findUser(String username, String password){
//根据用户名和密码查找
conn=getConnectionn();
try {
pStat =conn.prepareStatement("select * from users where username=? and password=?");
pStat.setString(1, username);
pStat.setString(2, password);//参数2代表第二个‘?’查找对应参数password
rs=pStat.executeQuery();
if( rs.next() )
return true;
else
return false;
}catch (Exception e) {
return false;
}
finally{
close();
}
} //end findUser
public boolean addUser(User user) {
//添加用户
conn=getConnectionn();
try {
pStat=conn.prepareStatement("insert into users values(null,?,?)");
pStat.setString(1, user.getUsername());
pStat.setString(2, user.getPassword());
int cnt=pStat.executeUpdate();//executeUpdate()返回执行成功sql语句的条数
if(cnt>0)
return true;
else
return false;
}catch (Exception e) {
return false;
}
finally{
close();
}
} //end add
} //end class
5.servlers包存放Servlet,
Servlet文件创建的时候会自动生成处理get请求的doGet()和处理post请求的doPost()方法,可以用一个service()方法代替
//RegServlet.java
@WebServlet("/RegServlet")
public class RegServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username=request.getParameter("username");//获取前端的值
String password=request.getParameter("password");
User user=new User();
user.setUsername(username);
user.setPassword(password);
UserDAO userdao=new UserDAO();
if( userdao.isUsernameExists(username) ){
request.getSession().setAttribute("err", "用户名已存在");//获得session对象
response.sendRedirect("register.jsp");
}
else{
boolean flag=userdao.addUser(user);
if(flag){
request.getSession().setAttribute("username", username);
response.sendRedirect("welcome.jsp");
}
else{
request.getSession().setAttribute("err", "注册失败");
response.sendRedirect("register.jsp");
}
}
}
} // end service
LoginServlet.java
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username=request.getParameter("username");
String password=request.getParameter("password");
UserDAO userdao=new UserDAO();
boolean flag=userdao.findUser(username, password);
if( flag ){
request.getSession().setAttribute("username", username);//获得session对象
response.sendRedirect("welcome.jsp");
}
else{
request.getSession().setAttribute("err", "用户名或密码不正确");
response.sendRedirect("login.jsp");
}
}
} // end service
6. jsp页面,分别是注册界面register.jsp 登录界面login.jsp 以及欢迎界面welcome.jsp
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%
String errMsg=(String)session.getAttribute("err");
if( errMsg!=null ) { %>
<div style="color:red;"><%=errMsg %></div>
<% session.removeAttribute("err");
}%>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="LoginServlet">
用户名<input type="text" name="username"><br />
密码<input type="password" name="password"><br />
<input type="submit" value="登录">
<input type="reset" value="重填">
</form>
</body>
</html>
register.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%
String errMsg=(String)session.getAttribute("err");
if( errMsg!=null ) { %>
<div style="color:red;"><%=errMsg %></div>
<% session.removeAttribute("err");
} %>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="RegServlet">
用户名<input type="text" name="username"><br />
密码<input type="password" name="password"><br />
<input type="submit" value="注册">
<input type="reset" value="重填">
</form>
</body>
</html>
welcome.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String username=(String)session.getAttribute("username");
if(username!=null&&!username.isEmpty()) { %>
你已经登录,欢迎<%=session.getAttribute("username") %>
<% }
else{
out.print("你还没有登录,3秒后自动跳往登录页面");
response.setHeader("refresh", "3;url=login.jsp");
} %>
本来我在webapp这个文件夹下面新建了一个view文件夹来存放jsp,如何发现运行jsp页面跳转到Servlet时显示404,找了半天才知道路径不对,直接把jsp文件放在webapp文件夹下面就ok了