【web演进】最初的Servlet

50 阅读3分钟

Web项目演进之最初的Servlet

现在我们开发一个web项目大部分采用最新的SpringBoot+mybaits来创建,中间关于web项目的细节都交给框架来处理,我们只需要关心业务代码就行了,但是这样如果碰到奇奇怪怪的问题,我们不知道里面的细节,就无从下手。我认为我们了解点原理对于我们排查问题还是有帮助的。

这是一个系列的文章,通过web项目从最初的Servlet逐步迭代到我们现在的框架,本人不才,希望通过自己的努力能让大家了解点东西,如有不足之处,欢迎评论区指正。

我记得刚接触web项目的时候,还是在大学,学的懵懵懂懂的,后来参加工作之后,也是直接接触的框架,对于底层的Servlet还是懵的状态,直到后面想了解点原理的时候,就想到了Servlet。

我们以最简单的登录和注册为例,开启我们的历程

web项目入口

一个web项目的入口一般都是web.xml,这个是tomcat的规范,关于tomcat东西,有时间可以探讨,此次不赘述。

来看一个web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    
    <servlet>
        <servlet-name>login</servlet-name>
        <servlet-class>com.fendaren.servlet.LoginServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>register</servlet-name>
        <servlet-class>com.fendaren.servlet.RegisterServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>login</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>register</servlet-name>
        <url-pattern>/register</url-pattern>
    </servlet-mapping>
    
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>

平平无奇,我们就定义了一个欢迎页和两个servlet,在servlet-mapping中定义了url-pattern,对于login和register的请求进行拦截,并交给相应的servlet处理。

请求处理

来看看我们的欢迎页

<body>
    <form action="login" method="post">
        用户名:<input type="text" name="username"></br>
        密 码:<input type="password" name="password"></br>
        <input type="submit" value="登录">
        <a href="register.html">注册</a>
    </form>
</body>

我们在表单设置了一个请求,请求login,这时会被拦截,并且交由LoginServlet做处理

public class LoginServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        UserDao userDao = new UserDao();
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        boolean isExist = userDao.select(username, password);
        if (isExist){
            resp.setContentType("text/html;charset=UTF-8");
            resp.getWriter().write("登录成功");
        }else {
            resp.setContentType("text/html;charset=UTF-8");
            resp.getWriter().write("登录失败");
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

此时请求会发到我们的doGet方法,然后我们进行接收参数,查表,返回结果。我们查表采用最原始的jdbc来操作的,如下

Class.forName("com.mysql.cj.jdbc.Driver");
            connection=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/web","root","root");
 String sql = "select * from user where username=? and password=?";
 pst = connection.prepareStatement(sql);
 pst.setString(1,username);
 pst.setString(2,password);
 rt= pst.executeQuery();
 if (rt.next()){
     return true;
 }else {
     return false;
 }

通过查询用户名和密码来确定此用户有没有登录成功

注册的流程是一样的,和登录类似,也是通过form表单发送请求,Servlet接收请求并处理

  <form action="register" method="post">
    用户名:<input type="text" name="username"></br>
    密 码:<input type="password" name="password"></br>
    <input type="submit" value="提交">
  </form>
@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        UserDao userDao = new UserDao();
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        boolean insert = userDao.insert(username, password);
        if (insert){
            resp.setContentType("text/html;charset=UTF-8");
            resp.getWriter().write("注册成功");
        }else{
            resp.setContentType("text/html;charset=UTF-8");
            resp.getWriter().write("注册失败");
        }
    }
Class.forName("com.mysql.cj.jdbc.Driver");
           connection=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/web","root","root");
String sql = "insert into user(username,password)values (?,?)";
pst = connection.prepareStatement(sql);
pst.setString(1,username);
pst.setString(2,password);
int i = pst.executeUpdate();
if (i>0){
    return true;
}else {
    return false;
}

效果

1692202874481.png

1692202907759.png

1692202926081.png

1692202950756.png

1692202981998.png

页面比较简陋,毕竟不是专业干前端的,大家见谅

总结

此为一个最最最简单的servlet项目,都是用的最基础的技术,没有涉及到框架,就想还原web项目最原始的模样。大道至简,框架的底层也是最基础的东西。