管理员登录的MVC
“MVC”就是“Model-View-Controller”模式
- Servlet用来处理请求事务,充当控制器 C 的角色。
- JSP是表示层,担任视图 V 的角色。
- JavaBean负责数据处理,模型 M 的角色,Model层是在复杂的商务逻辑上,提供简单统一的应用接口
以下是整体的程序结构
Servlet代码
- 这里说一下要注意的点,
request.getRequestDispatcher("/View/index.jsp").forward(request, response);
- 这条语句,我调试了接近一天的时间吧,因为这个路径的问题,就出现找不到JSP页面的问题,报404,400,各种报问题,后来通过调试,一步步看整体的运行,最终锁定了这条语句是有问题的,在不断的查资料,发现这个路径不是说你在idea里面按ctrl 点击会有反应就说明这个路径是对的,不是这样的,甚至你直接放绝对路径的时候,也不一定是对的,我尝试了连接到百度,发现是可以的,所以我就确定了,这个函数没问题,是我调用的问题,我看到了一句话,在getRequestDispatche里面,/是代表你的webroot的路径的,所以,我原来用…/web/View/index.jsp这种相对路径,虽然你idea里面是可以访问这个路径的,但是你在Servlet里面是访问不到的,所以一定要注意:
- 用 / 开始表示web目录下的东西,"/View/index.jsp",像这样,然后还有一个问题,即使你终于可以转到jsp页面了,但显示中文乱码,这个问题很容易解决,就是在doPost那边加一句response.setCharacterEncoding(“UTF-8”);,就解决了。
package Control;
import Model.Admin;
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 javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet(name = "LoginControl")
public class LoginControl extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String adminuser, adminpwd;
adminuser = request.getParameter("adminuser");
adminpwd = request.getParameter("adminpwd");
Admin admin = new Admin();
if (admin.validate(adminuser, adminpwd)) {
//可以运行到这一个步 说明 数据库没问题,有问题的是下面转向页面的语句有问题,所以要调试一个可以
//可以成功转向jsp页面的语句
System.out.println("匹配成功,登陆成功");
HttpSession session = request.getSession();
session.setAttribute("admin", adminuser);
//利用requestDispatcher对象的forward方法来跳转
//要..去返回上面 不然找不到
// response.sendRedirect("/AdminLoginMVC/web/adminLogin.jsp");
// 可以将页面跳转到任何路径,不局限于web应用中,跳转的过程中url地址变化,无法使用request.setAttribute来传递。
request.getRequestDispatcher("/View/index.jsp").forward(request, response);
} else {
System.out.println("匹配失败,登陆失败");
request.setAttribute("msg", "登录失败");
request.getRequestDispatcher("/View/adminLogin.jsp").forward(request, response);
}
}
}
在Admin.java里面实现了对数据库的操作,进行了用户名密码的判断,JavaBean的简单实用
package Model;
import java.sql.ResultSet;
public class Admin {
public boolean validate(String adminuser,String adminpwd){
DBbean connDB=null;
try {
connDB=new DBbean();
String sql="select adminpwd from admin where adminuser='"+adminuser+"'";
ResultSet rs=connDB.executeQuery(sql);
if(rs.next()&&rs.getString(1).equals(adminpwd))
return true;
else return false;
}catch (Exception e){
return false;
}finally{
connDB.close();
}
}
}
DBbean.java是一个工具类,将我们的数据库的基本信息封装在这个类中
package Model;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class DBbean {
private String driveStr= "com.mysql.cj.jdbc.Driver";
private String connStr="jdbc:mysql://127.0.0.1:3306/totoro?useSSL=true&characterEncoding=utf8&";
private String usernameStr = "root";
private String passwordStr = "root";
private Connection conn=null;
private Statement stmt=null;
//设计该工具类的静态初始化器中的代码,该代码在装入类时执行一次
public DBbean(){
try {
Class.forName(driveStr);
conn= DriverManager.getConnection(connStr,usernameStr,passwordStr);
stmt=conn.createStatement();
} catch (Exception e) {
System.out.println("无法同数据库连接");
}
}
//修改数据库用户记录的方法
public int executeUpdate(String s){
int result=0;
try {
result=stmt.executeUpdate(s);
}catch (Exception e){
System.out.println("执行更新错误");
}
return result;
}
//查询数据库用户记录的方法
public ResultSet executeQuery(String s){
ResultSet rs=null;
try {
rs=stmt.executeQuery(s);
}catch (Exception e){
System.out.println("执行查询错误");
}
return rs;
}
public void close(){
try {
stmt.close();
conn.close();
}catch (Exception e){
}
}
}
在web.xml中只加了这几句,Servlet-class指定你的Servlet,url-pattern是显示的地址,本来是有/Servlet在前面的,但看了很多文章,其实不加最好,可以避免很多路径上的问题
<servlet>
<servlet-name>LoginControl</servlet-name>
<servlet-class>Control.LoginControl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginControl</servlet-name>
<url-pattern>/LoginControl</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>/View/adminLogin.jsp</welcome-file>
</welcome-file-list>
然后是两个JSP的简单实现
adminLogin.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<%--<%--%>
<%-- String adminuser;--%>
<%-- adminuser=request.getParameter("adminuser")==null?"":request.getParameter("adminuser");--%>
<%--%>--%>
<body>
<table width="41%" align="center">
<tr>
<td>
<form name="adminLogin" action="LoginControl" method="post">
<br>管理员登录<br>
管理员:<input type="text" name="adminuser">
密码:<input type="password" name="adminpwd">
<input type="submit" name="submit" value="登录">
<input type="reset" name="reset" value="取消">
</form>
</td>
</tr>
</table>
</body>
</html>
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>default page</title>
</head>
<body>
登录成功!
</body>
</html>
结果截图:实现了可以读数据库,在Servlet进行比较,在jsp进行显示,大致逻辑是OK的
总的来说,调bug真的累,但是但有了进展出现思路的时候,还是会非常开心,虽然很累,这里MVC告一段落。