引言:这是之前做的作业,也不怎么理解透,现在分层,做的详细一些,加深对mvc模式的理解,就当回顾知识了
目录
一.实验目的
使用JSP+Javabean+Servlet实现一个简单的模型
JSP+Javabean+Servlet+mysql数据库
要求:完成注册、登录、退出三个功能
二.实验工具
1.jdk-17.0.2、
2.tomcat-10.0.20、
3.微软浏览器DEV-105.0.1300.0、
4.mysql-8.0.26、
5.Eclipse IDE for Enterprise Java and Web Developers (includes Incubating components) Version: 2021-12 (4.22.0)
三.主要文件说明
1.eclipse文件部署,如下图
2.login.jsp:登录页面,有用户名、密码两个输入框,源码如下图
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>实验五登录界面</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css"
integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
<script type="text/javascript">
function confirmReset(){
var clickresult = false;
clickresult =window.confirm("点击重填后所有信息都将被清空。\n你确认重填吗?");
return clickresult;
}
</script>
<style>
body { /*大主背景图*/
background-image: url("sunOcean.jpg");
background-size: cover;
background-position-x: center;
}
.layout { /*设置登录窗口部分的样式*/
width: 900px;
height: 530px;
position: relative;
box-sizing: border-box;
margin-left: 300px;
margin-top: 90px;
padding: 1px;
border: 8px solid silver;
border-radius: 2px;
background-image: url("sunOcean.jpg");
background-size: 1300px;
background-position-x: center;
background-position-y: -125px;
z-index: 1;
}
.layout::after { /*设置背景虚图层*/
content: "";
position: absolute;
width: 100%;
height: 100%;
background: inherit;
left: 0;
top: 0;
filter: blur(5px);
z-index: 2;
}
.input { /*登录条框布局*/
margin-top: 160px;
margin-left: 250px;
margin-right: 250px;
}
.input-group { /*调节账号和密码框图层*/
position: relative;
z-index: 3;
}
.input-group { /*调节两个输入框的之间距离*/
padding: 15px;
}
#sub{ /* 设置登录、清空两个按钮的形状、背景颜色、弧度*/
position: relative;
z-index: 3;
margin-top: 15px;
margin-left: 60px;
background-color: cornflowerblue;
color: white;
font-size: 20px;
border-radius: 7px;
width: 100px;
height: 40px;
}
.submit-default { /*设置登录按钮无边框、按钮文字位置*/
border-style: none;
outline: none;
position: absolute;
}
.bz { /*火焰图标*/
position: absolute;
z-index: 3;
font-size: 80px;
margin-left: 360px;
margin-top: 40px;
}
#注册 { /*注册超链接的设置*/
position: absolute;
z-index: 3;
color:white;
margin-top: 15px;
margin-left: 725px;
}
</style>
</head>
<body>
<div class="layout">
<div id="注册">
<span>暂无账号?</span><a href="register.jsp" style="color:palegreen">立即注册</a>
</div>
<div class="bz"><font color="#22ffb9"> </font>
<span class="glyphicon glyphicon-fire" aria-hidden="true"
style="color: red;"></span>
</div>
<div class="input">
<form action="../Login" method="post">
<div class="input-group">
<span class="input-group-addon" id="basic-addon1"><label for="text1"><span
class="glyphicon glyphicon-user" aria-hidden="true" style="color:blue"></span> 账号</label></span>
<input type="text" class="form-control" id="text1" placeholder="请输入用户名" name="username"
aria-describedby="basic-addon1">
</div>
<div class="input-group">
<span class="input-group-addon" id="basic-addon2"> <label for="test2"><span
class="glyphicon glyphicon-leaf" aria-hidden="true" style="color:blue"></span> 密码</label></span>
<input type="password" class="form-control" id="test2" placeholder="请输入密码" name="password"
aria-describedby="basic-addon1" required="">
</div>
<div>
<input type="submit" id="sub" class="submit-default" value="登录" size="5px" >
<input type="submit" id="sub" class="submit-default" value="清空" size=5px" onclick="confirmReset()">
</div>
</form>
</div>
</div>
</body>
</html>
3.register.jsp:注册页面,源码如下图
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>注册界面</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css"
integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
<script type="text/javascript">
function confirmReset(){
var clickresult = false;
clickresult =window.confirm("点击重填后所有信息都将被清空。\n你确认重填吗?");
return clickresult;
}
</script>
<style>
body { /*大主背景图*/
background-image: url("sky.jpg");
background-size: cover;
background-position-x: center;
}
.layout { /*设置登录窗口部分的样式*/
width: 900px;
height: 530px;
position: relative;
box-sizing: border-box;
margin-left: 300px;
margin-top: 90px;
padding: 1px;
border: 8px solid silver;
border-radius: 2px;
background-image: url("sky.jpg");
background-size: 1300px;
background-position-x: center;
background-position-y: -125px;
z-index: 1;
}
.layout::after { /*设置背景虚图层*/
content: "";
position: absolute;
width: 100%;
height: 100%;
background: inherit;
left: 0;
top: 0;
filter: blur(5px);
z-index: 2;
}
.input { /*登录条框布局*/
margin-top: 160px;
margin-left: 250px;
margin-right: 250px;
}
.input-group { /*调节账号和密码框图层*/
position: relative;
z-index: 3;
}
.input-group { /*调节两个输入框的之间距离*/
padding: 15px;
}
#sub{ /* 设置登录、清空两个按钮的形状、背景颜色、弧度*/
position: relative;
z-index: 3;
margin-top: 15px;
margin-left: 60px;
background-color: cornflowerblue;
color: white;
font-size: 20px;
border-radius: 7px;
width: 100px;
height: 40px;
}
.submit-default { /*设置登录按钮无边框、按钮文字位置*/
border-style: none;
outline: none;
position: absolute;
}
.bz{ /*五色花*/
position: absolute;
z-index: 3;
margin-top: 20px;
margin-left: 405px;
width: 80px;
height: 80px;
}
.bz span{
display: block;
width: 40px;
height: 40px;
background:#317ef3;
border-radius: 0 100px;
transform-origin: 100% 100%;
position: absolute;
}
.bz .petal2{
transform: rotate(72deg);
}
.bz .petal3{
transform: rotate(144deg);
}
.bz .petal4{
transform: rotate(216deg);
}
.bz .petal5{
transform: rotate(288deg);
}
</style>
</head>
<body>
<div class="layout">
<div class="bz"><font color="#22ffb9"> </font>
<span class="petal1" style="background-color: pink"></span>
<span class="petal2" style="background-color: greenyellow"></span>
<span class="petal3" style="background-color: plum">></span>
<span class="petal4" style="background-color: cyan">></span>
<span class="petal5" style="background-color: coral">></span>
</div>
<div class="input">
<form action="../Register" method="post">
<div class="input-group">
<span class="input-group-addon" id="basic-addon1"><label for="text1"><span
class="glyphicon glyphicon-user" aria-hidden="true" style="color:blue"></span> 账号</label></span>
<input type="text" class="form-control" id="text1" placeholder="请输入用户名" name="username"
aria-describedby="basic-addon1">
</div>
<div class="input-group">
<span class="input-group-addon" id="basic-addon2"> <label for="test2"><span
class="glyphicon glyphicon-leaf" aria-hidden="true" style="color:blue"></span> 密码</label></span>
<input type="password" class="form-control" id="test2" placeholder="输入密码" name="password"
aria-describedby="basic-addon1" >
</div>
<div class="input-group">
<span class="input-group-addon" id="basic-addon2"> <label for="test2"><span
class="glyphicon glyphicon-leaf" aria-hidden="true" style="color:blue"></span> 密码</label></span>
<input type="password" class="form-control" id="test2" placeholder="确认密码" name="password2"
aria-describedby="basic-addon1" >
</div>
<div>
<input type="submit" id="sub" class="submit-default" value="注册" size="5px" >
<input type="submit" id="sub" class="submit-default" value="清空" size=5px" onclick="confirmReset()">
</div>
</form>
</div>
</div>
</body>
</html>
4.dss.jsp:登录成功后进入的页面,源码如下图
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<% if(session == null || session.getAttribute("username") == null || session.getAttribute("password") == null){
response.sendRedirect("login.jsp");
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>多搜索引擎</title>
<style type="text/css">
body{background-image: url(140.jpg);}
#form1{
width:200px;
float: right;
}
#form2{
float: right;
}
.to {
width: 100px;
height: 100px;
border-radius: 50%;
position: absolute;
top: 50%;
left: 50%;
margin-left: -50px;
margin-top: -50px;
}
.to1 {
width: 104px;
height: 104px;
border-radius: 50%;
background-color: white;
position: relative;
}
.to2 {
width: 104px;
height: 104px;
border-radius: 50%;
position: absolute;
top: 50%;
left: 50%;
margin-left: -52px;
margin-top: -52px;
}
.to3 {
width: 106px;
height: 106px;
border-radius: 50%;
background-color: aqua;
position: relative;
}
</style>
<script type="text/javascript">
</script>
</head>
<body>
<div id="form2">
<select name="select" onchange="window.open(this.options[this.selectedIndex].value,target='_self')">
<option value ="" selected=""></option>
<option value ="login.jsp">登录</option>
<option value ="register.jsp">注册</option>
<option value ="quit.jsp">退出</option>
</select>
</div>
<div id="form1">
<div class="to3" align="center">
<div class="to2" align="center">
<div class="to1" align="center">
<img class="to" alt="aaa" src="https://img0.baidu.com/it/u=162763160,1033376039&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=500">
</div>
</div>
</div>
</div>
<br/>
<div id="form3">
<!-- select:标签设置下拉表单 value值存放要跳转的相对链接地址 ,
表单放置两个超链接的选项(登录和注册)第一个选项设置默认空白是为了好看,
也可以去掉 window.open(this.options[this.selectedIndex].value,target='_self'):这条语句起到连接超链接的作用,具体原理是什么,我也不知道,网上查资料找到 -->
<center>
<select style="width: auto;height: auto;" size="0" name="select2" onchange="window.open(this.options[this.selectedIndex].value,target='_blank')">
<option value="https://www.baidu.com/">百度</option>
<option value ="https://www.sogou.com/">搜狗</option>
<option value ="http://soso.com/">搜搜</option>
<option value ="https://cn.bing.com/">必应</option>
<option value ="https://hao.360.com/">360搜索</option>
<option value ="https://quark.sm.cn/?from=smor&safe=1">神马搜索</option>
</select>
</center>
</div>
</body>
</html>
5.web.xml:配置文件,源码如下图
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:web="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd http://xmlns.jcp.org/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="5.0">
<display-name>webTestLab</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.jsp</welcome-file>
<welcome-file>default.htm</welcome-file>
</welcome-file-list>
<servlet>
<description></description>
<display-name>Login</display-name>
<servlet-name>Login</servlet-name>
<servlet-class>com.labFive.servlet.Login</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Login</servlet-name>
<url-pattern>/Login</url-pattern>
</servlet-mapping>
<servlet>
<description></description>
<display-name>Register</display-name>
<servlet-name>Register</servlet-name>
<servlet-class>com.labFive.servlet.Register</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Register</servlet-name>
<url-pattern>/Register</url-pattern>
</servlet-mapping>
</web-app>
6.user.sql:mysql数据表的创建,如下图
drop database if exists school;
create database school default charset utf8;
use school;
create table tb_user(id int primary key auto_increment,
userName varchar(20) not null,
password varchar(20) not null);
7.DbParam.java(bean数据层):连接数据库一些变量及set和get方法,如下图
package com.labFive.bean;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
//bean层:mysql相关参数及set和get方法
public class DbParam {
private String driver = "com.mysql.cj.jdbc.Driver"; // 驱动
private String url = "jdbc:MySQL://localhost:3306/school?&useSSL=false&serverTimezone=UTC"; //指向数据库school
private String dbUser = ""; //数据库用户名
private String dbPassword = ""; //数据库用户密码
private Connection conn = null; //数据库连接对象
private Statement stm = null; //数据库声明对象
private ResultSet rs = null; //数据库结果集对象
public String getDriver() {
return driver;
}
public void setDriver(String driver) {
this.driver = driver;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getDbUser() {
return dbUser;
}
public void setDbUser(String dbUser) {
this.dbUser = dbUser;
}
public String getDbPassword() {
return dbPassword;
}
public void setDbPassword(String dbPassword) {
this.dbPassword = dbPassword;
}
public Connection getConn() {
return conn;
}
public void setConn(Connection conn) {
this.conn = conn;
System.out.println("conn赋值成功--");
}
public Statement getStm() {
return stm;
}
public void setStm(Statement stm) {
this.stm = stm;
System.out.println("stm赋值成功");
}
public ResultSet getRs() {
return rs;
}
public void setRs(ResultSet rs) {
this.rs = rs;
System.out.println("rs赋值成功");
}
}
8.mysqlConn.java(dao数据控制层):封装数据库的连接、查询、更新、关闭等几个函数,源码如下图
package com.labFive.dao;
import java.sql.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import com.labFive.bean.*;
//dao层:实现数据库的连接,封装连接、更新、查询以及关闭连接几个函数
public class mysqlConn {
DbParam dbParam;
Connection conn;
Statement stm;
ResultSet rs;
//声明一个连接数据库的方法,返回true表示连接数据库成功
public boolean createConn(DbParam dbParam) {
this.dbParam=dbParam;
boolean result = false;
try {
Class.forName(dbParam.getDriver()); //加载驱动
conn = DriverManager.getConnection(dbParam.getUrl(),dbParam.getDbUser(),dbParam.getDbPassword()); //连接数据库
dbParam.setConn(conn);
result = true;
System.out.println("加载驱动成功--");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("mysqlConn.createConn(DbParam dbParam):ClassNotFoundException这里报错");
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("mysqlConn.createConn(DbParam dbParam):SQLException这里报错");
e.printStackTrace();
}
return result;
}
//声明更新数据库的方法,注册用户名、密码,参数:更新的sql语句,返回:true表示更新成功
public boolean update(String sql) {
boolean up = false;
try {
stm = conn.createStatement();
stm.executeUpdate(sql);
dbParam.setStm(stm);
up = true;
System.out.println(sql+":更新操作成功--");
}catch(Exception e) {
System.out.println(e.toString());
System.out.println("mysqlConn.update(String sql):Exception这里报错");
}
return up;
}
//声明查询方法,查询输入的用户名与数据库的用户名、密码是否匹配
public void query(String sql) {
try {
stm = conn.createStatement();
rs = stm.executeQuery(sql);
dbParam.setRs(rs);
System.out.println(sql+":查询操作成功--");
}catch(Exception e) {
System.out.println("mysqlConn.query(String sql):Exception这里报错");
System.out.println(e.toString());
}
}
//关闭数据库连接 关闭资源,依次关闭 rs、stm、conn
public void closeRs() {
try {
rs.close();
System.out.println("rs关闭成功--");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void closeStm() {
try {
stm.close();
System.out.println("stm关闭成功");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void closeConn() {
try {
conn.close();
System.out.println("conn关闭成功");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
9.Login.java(service业务层):处理登录请求,并跳转到相关页面,如下图
package com.labFive.servlet;
import jakarta.servlet.*;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.labFive.bean.*;
import com.labFive.dao.*;
/**
* Servlet implementation class Login
*/
public class Login extends HttpServlet {
//这个(doPost)函数是处理请求转发的,通过接收登录页面(login.jsp)参数,调用LogincalProcessing.java的login方法将参数
//传递过去,对函数返回值进行判断并跳转到相关页面
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//从login.jsp获取from表单的参数:username、password
String username = request.getParameter("username");
String password = request.getParameter("password");
//声明请求转发变量 rd
RequestDispatcher rd;
//声明out对象,用于输出在浏览器页面
PrintWriter out = response.getWriter();
if(new LogincalProcessing().login(username,password) == "dss.jsp") {
//login() 方法返回值(String类型)等于dss.jsp,说明登录成功
HttpSession session = request.getSession(); //声明一个session(对话)
//传递给session两个参数,用于验证(在dss.jsp验证)并防止未登录就可以直接访问页面
session.setAttribute("username", username);
session.setAttribute("password", password);
//手动连接跳转到dss.jsp
out.println("<html>"+
"<head>"+
"<meta charset='utf-8'>"+
"<script type='text/javascript'>alert('用户名密码正确,登录成功!\\n确定后2秒跳转');</script>"+
"</head>"+
"<body>"+
"<h1>"+
"<center>"+
"<h2>恭喜你登录成功!</h2>"+
"<a href='../webTestLab/labFive/dss.jsp'>手动跳转到多搜索页面</a>"+
"</center>"+
"</h1>"+
"</body>"+
"</html>");
response.setHeader("Refresh", "2;url=../webTestLab/labFive/dss.jsp");
rd = request.getRequestDispatcher("../webTestLab/labFive/dss.jsp"); //跳转到dss.jsp页面
rd.forward(request, response);
}else {
out.println("<html>"+
"<head>"+
"<meta charset='utf-8'>"+
"<script type='text/javascript'>alert('用户名或密码错误!\\n确定后0.5秒重新登录');</script>"+
"</head>"+
"<body>"+
"<h1>"+
"<center>"+
"<h2>用户名或密码错误!</h2>"+
"<a href='../webTestLab/labFive/login.jsp'>重新登录</a>"+
"</center>"+
"</h1>"+
"</body>"+
"</html>");
response.setHeader("Refresh", "0.5;url=../webTestLab/labFive/login.jsp");
rd = request.getRequestDispatcher("../webTestLab/labFive/login.jsp");
rd.forward(request, response);
}
}
}
10.Register.java(service业务层):处理注册请求,并跳转到相关页面,如下图
package com.labFive.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import com.labFive.dao.*;
/**
* Servlet implementation class Register
*/
public class Register extends HttpServlet {
//这个函数是输出提示语句
public static void outHtml(String url,String str,String str2,HttpServletResponse response) {
//手动连接跳转到dss.jsp
PrintWriter out;
try {
out = response.getWriter(); //声明out对象,用于输出在浏览器页面
out.println(
"<html>"+
"<head>"+
"<meta charset='utf-8'>"+
"<script type='text/javascript'>alert('"+str2+"');</script>"+
"</head>"+
"<body>"+
"<h1>"+
"<center>"+
"<a href='"+url+"'>"+str+"</a>"+
"</center>"+
"</h1>"+
"</body>"+
"</html>");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
//这个方法是处理请求转发的,接收注册页面(register.jsp)传递的三个参数,调用RegisterProcessing.java里面的register
//方法将三个参数传递过去,函数返回值进行判断并跳转到相应的页面
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//从register.jsp获取from表单的参数:username、password、password2
String username = request.getParameter("username");
String password = request.getParameter("password");
String password2 = request.getParameter("password2");
String url = new RegisterProcessing().register(username, password, password2),str,str2; //register() 方法返回值(String类型)
ScriptEngineManager se=new ScriptEngineManager();
ScriptEngine engine=se.getEngineByName("js"); //声明什么类型的脚本
//url可能等于inputNull或者register.jsp或者pwdpwd2或者login.jsp,然后下面是对url的不同情况进行判断,进行不同的操作
if(url.equals("inputNull")){
url="../webTestLab/labFive/register.jsp";
str="用户名、密码不能为空,也不能包含空格!重新注册";
str2="用户名、密码不能为空,也不能包含空格!重新注册!\\n确定后0.5秒自动跳转";
outHtml(url,str,str2,response); //调用方法输出手动点击链接(防止自动跳转失败)
response.setHeader("Refresh", "0.5;url=../webTestLab/labFive/register.jsp"); //直接不用等待就自动刷新到register.jsp页面
}else{
if(url.equals("register.jsp")){
url="../webTestLab/labFive/register.jsp";
str="用户名已经存在!重新注册";
str2="用户名已经存在!重新注册!\\n确定后0.5秒自动跳转";
outHtml(url, str,str2, response); //调用方法输出手动点击链接(防止自动跳转失败)
response.setHeader("Refresh", "0.5;url=../webTestLab/labFive/register.jsp"); //0.5秒自动跳转页面
}else if(url.equals("pwdpwd2")){
url="../webTestLab/labFive/register.jsp";
str="两次输入的密码不一致,请检查密码!重新注册";
str2="两次输入的密码不一致,请检查密码!重新注册!\\n确定后0.5秒自动跳转";
outHtml(url, str,str2, response); //调用方法输出手动点击链接(防止自动跳转失败)
response.setHeader("Refresh", "0.5;url=../webTestLab/labFive/register.jsp"); //2秒自动跳转页面
}else{
if(url.equals("login.jsp")){
url="../webTestLab/labFive/login.jsp";
str="恭喜你注册成功!手动跳转登录页面";
str2="恭喜你注册成功!\\n确定后2秒自动跳转";
outHtml(url, str,str2, response); //调用方法输出手动点击链接(防止自动跳转失败)
response.setHeader("Refresh", "2;url=../webTestLab/labFive/login.jsp"); //2秒自动跳转页面
}else{
url="../webTestLab/labFive/register.jsp";
str="用户注册失败!重新注册";
str2="用户注册失败,重新注册!\\n确定后0.5秒自动跳转";
outHtml(url, str,str2, response); //调用方法输出手动点击链接(防止自动跳转失败)
response.setHeader("Refresh", "0.5;url=../webTestLab/labFive/register.jsp");
}
}
}
}
}
四.实验主要过程
1.代码运行流程图,如下图
2.实际操作流程展示
①.启动MySQL,然后在start.html执行代码,右键执行代码,eclipse会自动启动Tomcat服务器,会打开微软浏览器访问到start.html,点击注册,跳转到注册页面,如下图
②.在注册页面输入用户名密码,点击注册,如果注册成功会自动跳转到登录页面,如果注册失败会提示相应的错误,重新注册,如下图
③.验证注册是否成功,在MySQL查询注册信息,看到刚才注册的信息存到表中说明注册成功,如下图
④.在登录页面输入用户名和密码,成功会自动跳转到登录成功页面(dss.jsp),页面有多个搜索引擎下拉列表,如下图
⑤.退出,点击右上角下拉列表退出,自动返回开始页面(start.html),如下图
⑥.最后关闭在eclipse停止运行代码(会自动关闭服务器),再关闭MySQL,实验结束。
五.实验报错及解决
1.报错如下
报错原因及解决:eclipse创建servlet自动生成的方法是protected,是受保护的,需要改成公共方法才能访问,如下图
2.报错如下,servlet中运行js报错
报错原因及解决:原因我安装的jdk17,高版本好像不支持js这种写法(jdk 11可以支持),没办法在servlet里面运行,我只能创建out对象,在输出到浏览器的html中运行js,如下图
3.报错提示rs(结果集)为null,原因:在两个java文件调用第三个java文件里面的函数时,new两次类,引用名虽然相同,却是不同的对象。解决:new一次类,将引用名作为函数参数传递到另一个java文件 去调用第三个java文件的函数,如下图
六.结语
看来一些基础没打好,第三个报错找半天才解决,也算是温故而知新了,不足之处可以指出,互相学习学习,需要源码如下链接(eclipse整个项目):mvc模式+mysql实现登录注册退出功能.zip - 蓝奏云