【什么是Servlet】
Servlet全称Java Servlet,未有中文译文。是用Java编写的服务器端程序,用来完成B/S架构下,客户端请求的响应的处理是跨平台的,通常以多线程方式运行。Servlet API为Servlet提供了统一的编程接口。Servlet一般在容器中运行,Servlet的生命周期由容器管理。常见的Servlet容器Tomcat、Resin、Jetty。本文主要使用的是tomcat服务器来
Servlet的框架的核心是javax.servlet.Servlet接口,所有的Servlet都必须实现这一接口.在Servlet接口中定义了5个方法,其中有3个方法代表了Servlet的声明周期:
- init方法,负责初始化Servlet对象
- service方法,负责相应客户的请求,当请求一个Servlet首先到达该方法,该方法再分发到相应的处理方法
- destory方法,当Servlet对象退出声明周期时,负责释放占有的资源
【第一个servlet程序】
HttpServlet主要方法
请求处理方法:(分别对应http协议的7种请求)
1、doGet 响应Get请求,常用2、doPost 响应Post请求,常用
3、doPut 用于http1.1协议4、doDelete 用于http1.1协议
5、doHead 仅响应Get请求的头部
6、doOptions 用于http1.1协议7、doTrace 用于http1.1协议
web目录结构:
-tomcat
--webapps
---test_servlet
----WEB-INF
-----classes
-----lib
-----web.xml
----login.html
代码展示:
web.xml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0"
metadata-complete="true">
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/loginServlet</url-pattern>
</servlet-mapping>
</web-app>
login.html
<html>
<head>
<title>登录</title>
</head>
<body>
<!--
<form action="http://127.0.0.1:8080/test_servlet/loginServlet">
-->
<!--
<form action="loginServlet">
-->
<!--
<form action="exam/loginServlet" method="get">
-->
<form action="loginServlet" method="get">
用户:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
LoginServlet.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class LoginServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException,
IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("username=" + username);
System.out.println("password=" + password);
response.setContentType("text/html;charset=GB18030");
response.getWriter().println("Login Success!!!");
}
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException,
IOException {
doGet(request, response);
}
}
第一步,单击登陆之后,web请求就到达tomcat了,在访问的时候用web项目的名称,根据URL截取项目名称test_servlet,这个文件夹下面都是sun定义的规范,自己就会去读取里面的内容分类的。下一步,根据URL截取servlet的访问名称:loginServlet,在web.xml文件中,通过servlet-name标签可以找到对应的classLoginServlet,在这个xml文件中,url-pattern是你给它取得一个虚拟路径。这样一个顺序:url-pattern到servlet-name,从servlet-name到servlet-class。
第二步,通过根据找到的class反射对LoginServlet进行实例化,之后会调用servlet中的service方法。通过req.Method方法调用到doPost或者doGet方法,将具体的实现委托给自己写的方法里面。实际上就是通过service进行分发。
第三步,解析取得参数值request.getParameter("username");,调用业务逻辑层。第四步,response,将html字符串发送给web,进行渲染页面。
【采用UML分析调用流程】
【遇到的问题解决】
问题一:找不到jar包,如下图
import javax.servlet.*;这句话在导入jar包的时候,代码找不到。解决的方法是手动的在环境变量下配置classpath。
问题二:tomcat运行启动批处理文件的时候,一闪而过
解决:通过java_home这个变量,拿到相关的类库。然后,如果这样配置,startup.bat还是一闪而过,可以右键点击startup.bat,编辑,在文本的最后敲上pause,保存后重新运行startup.bat,这时候窗口不会再一闪而过,而是停留在桌面上(调试成功,把pause去掉即可)。
【总结】
4.1 经常画图可以帮助你理解代码之间的调用关系。
4.2 复杂的事情一定有简单的入口,终于进入状态,加油