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;
}
效果
页面比较简陋,毕竟不是专业干前端的,大家见谅
总结
此为一个最最最简单的servlet项目,都是用的最基础的技术,没有涉及到框架,就想还原web项目最原始的模样。大道至简,框架的底层也是最基础的东西。