目录
▐ 前端准备工作
在html文件中创建一个简单的登陆表单,点击登录按钮向后端程序提交表单信息
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<form action="http://127.0.0.1:8088/stuServer/login" method="post">
账号:<input type="text" name="account" value="" />
<br />
密码:<input type="password" name="password" value="" />
<br />
<input type="submit" value="登录" />
</form>
</body>
</html>
▐ 后端接收并响应
• 在后端创建对应的Servlet处理程序
让类继承HttpServlet并重写doPost方法,接收前端请求,与数据库交互,向前端做出响应。
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.io.PrintWriter;
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("post");
String account =req.getParameter("account");
String password =req.getParameter("password");
System.out.println(account);
System.out.println(password);
//调用jdbc与数据库交互
LoginDao loginDao = new LoginDao();
boolean res = false;
try {
res = loginDao.login(account, password);
} catch (Exception throwables) {
//throwables.printStackTrace();
System.out.println("稍后再试!");
}
//做出响应
PrintWriter writer = resp.getWriter();
if (res){
writer.write("<b>登录成功</b>");
}else {
writer.write("<b>登录失败</b>");
}
}
}
• 在web.xml文件中配置Servlet访问地址
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>stuServer.web.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
▐ dao层与数据库交互
这里所用到的是之前JDBC的知识,不做过多解读,如图所示,所要注意的是数据库名是否正确。
📖JDBC代码:
import com.mysql.cj.jdbc.Driver;
import java.sql.*;
public class LoginDao {
public boolean login(String account,String password) throws SQLException {
DriverManager.registerDriver(new Driver());
String url="jdbc:mysql://127.0.0.1:3306/chatdb?serverTimezone=Asia/Shanghai";
String user ="root";
String pwd="root";
Connection connection =null;
PreparedStatement ps =null;
try {
connection = DriverManager.getConnection(url, user, pwd);
ps =connection.prepareStatement("Select account from user where account=? and password=?");
ps.setObject(1, account);
ps.setObject(2, password);
ResultSet rs = ps.executeQuery();
return rs.next();
}finally {
if (ps!=null){
ps.close();
}
if (connection!=null){
connection.close();
}
}
}
}
▐ 后端过滤器拦截
这里引出了过滤器的概念,所以先给大家介绍下过滤器:
➱ 过滤器是JavaEE规范中定义的一种技术,可以让请求达到目标Servlet之前,先进入到过滤器中,在过滤器中统一进行一些拦截处理,当处理完成后,可以继续向后执行到达目标Servlet,如果配置了多个过滤器,也可以进入到下一个过滤器。
➱ 一个过滤器可以配置给多个资源使用,一个资源也可以配置多个过滤器,按照配置顺序调用。
➱ 过滤器的作用:提高代码复用性,提高可维护性。
➱ 过滤器的使用场景:统一编码过滤、权限验证、跨域过滤。
今天的案例将会用到编码过滤,所以接下来让我们来搭建一个编码过滤器吧!
• 创建过滤器
import javax.servlet.*;
import java.io.IOException;
public class EncodingFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("编码过滤器");
//设置请求编码集
servletRequest.setCharacterEncoding("utf-8");
//设置响应编码集
servletResponse.setContentType("text/html;charset=utf-8");
//让请求离开过滤器继续向下执行,下一个可能是过滤器或目标访问的servlet
filterChain.doFilter(servletRequest,servletResponse);
}
}
• 在web.xml文件中配置过滤器
<!-- 注册编码过滤器-->
<filter>
<filter-name>encoding</filter-name>
<filter-class>stuServer.filter.EncodingFilter</filter-class>
</filter>
<!-- 配置哪些地址可以进入到编码过滤器-->
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern> <!-- /* 表示所有向后端发送的请求,都进入到编码过滤器中-->
</filter-mapping>
📖关于过滤器的创建更详细的介绍可参考:JavaEE:过滤器_javaee中的过滤器作用-CSDN博客
▐ 测试
最终我们在浏览器中进行测试,点击登录按钮,若数据库中存在所输入的账号和密码,根据后端所写程序响应 "登录成功",反之数据库没有则显示 "登录失败"。
这里有个小问题:
如果按照这样的请求方式,当网页与后端交互时,前端不能再进行其他操作,服务器端响应回来的内容会把整个浏览器中的内容覆盖掉,所以这种请求方式在前后端交互时显得很不友好。
这里就涉及到同步请求和异步请求的问题了,下一篇会详细介绍~~
▐ 结语
本次的分享就到此为止了,希望我的分享能给您带来帮助,创作不易也欢迎大家三连支持,你们的点赞就是博主更新最大的动力!如有不同意见,欢迎评论区积极讨论交流,让我们一起学习进步!有相关问题也可以私信博主,评论区和私信都会认真查看的,我们下次再见
海漫浩浩,我亦苦作舟!大家一起学习,一起进步! 本人微信:g2279605572