-
Servlet的原理
servlet就是众多响应程序的一个响应程序(web中是以servlet为基本单位的响应(函数)方式),而具体怎么响应是通过关联一个java类来实现的,java类里面的某些方法就是具体怎么响应的源码了,一个具有特定响应功能的(可以看成就是一个函数功能),一个.java文件,编译后就是一个.class文件,存在于服务器端的电脑 。servlet这时候就是一个基本响应模块,就相当于是一个函数,是可以被外部调用的,比如别的函数调用它(通过实例化它关联的那个java类吧),或者直接在客户端通过输入URL(网址)来直接访问他,那这个URL是多少呢?由下面web.xml里面指定:
<
servlet
>
<
servlet-name
>input</
servlet-name
>
<
servlet-class
>org.lxh.servlet.InputServlet</
servlet-class
> // 指定这个servlet关联的是哪个类,这个类就具体指定了怎样的响应方式
</
servlet
>
<
servlet-mapping
>
<
servlet-name
>input</
servlet-name
>
<
url-pattern
>/servletdemo/input</
url-pattern
> // 这里就是指定这个servlet的URL
</
servlet-mapping
>
由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成。
比如一个表单的提交按钮按下后:
这里的表单数据会提交且访问到路径为 "input" 的servlet,实际上这是一个相对地址,完整的是:xxx/xxx/input 这个URL指向的servlet,或者一个xxx.html也行(但是也是会调用缺省的servlet)
向何处发送表单数据。 可能的值:
|
同一个Servlet可以被映射到多个URL上,即多个<servlet-mapping>元素的<servlet-name>子元素的设置值可以是同一个Servlet的注册名
在Servlet映射到的URL中也可以使用*通配符,但是只能有两种固定的格式:一种格式是"*.扩展名",另一种格式是以正斜杠(/)开头并以"/*"结尾
缺省Servlet
如果某个Servlet的映射路径仅仅为一个正斜杠(/),那么这个Servlet就成为当前Web应用程序的缺省Servlet。
凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,它们的访问请求都将交给缺省Servlet处理,也就是说,缺省Servlet用于处理所有其他Servlet都不处理的访问请求。
当访问不存在的Servlet时,就使用配置的默认Servlet进行处理,如下图所示:
当访问Tomcat服务器中的某个静态HTML文件和图片时(因为在浏览器中访问的URL都是指servlet的URL,但是我们输入的是一个.html静态页面URL,这时候肯定就不是一个servlet,那么首先浏览器会首先加载出这个.html文件页面,其次,服务器会把缺省的servlet的执行结果返回给客户端浏览器,即一个每次浏览器的访问总是有一个servlet会与之响应),实际上是在访问这个缺省Servlet。
-
servlet运行过程
- Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后(比如表单中提交按钮发射数据):
①Web服务器首先检查是否已经装载并创建了该Servlet的实例对象(在服务器的jvm运行上面那个java类)。如果是,则直接执行第④步,否则,执行第②步。
②装载并创建该Servlet的一个实例对象。 这是第一次浏览器这个页面的这个表单按钮按下的请求
③调用Servlet实例对象的init()方法。
④创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
⑤WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。
Servlet接口实现类
Servlet关联的那个类,SUN公司定义了两个默认实现类,分别为:GenericServlet、HttpServlet。
HttpServlet指能够处理HTTP请求的servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。
HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。因此,开发人员在编写Servlet时,通常只需要覆写doGet或doPost方法,而不要去覆写service方法。例如下面这样写就ok:
那么这个servlet关联的java类 里面可以实现哪些功能呢:
- JavaWeb中servlet主要功能是承载网络连接,业务逻辑处理,比如一些编码格式的转换、登录拦截,数据库的增删查改,然后把数据处理结果以一定得数据格式返回给浏览器(不一定是HTML内容格式的形式), 这时候浏览器就会根据接收到的数据的格式做对应的操作,比如浏览器提交了表单,这时候服务器端的servlet处理好后回传给浏览器进行登录成功或者失败的显示
- 根据客户端请求生成响应内容并将其传给服务器,生成动态的Web内容,例如下面代码:
-
23 public void doGet(HttpServletRequest request, HttpServletResponse response) 24 throws ServletException, IOException { 25 26 response.setContentType("text/html"); 27 PrintWriter out = response.getWriter(); 28 out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); 29 out.println("<HTML>"); 30 out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); 31 out.println(" <BODY>"); 32 out.print(" This is "); 33 out.print(this.getClass()); 34 out.println(", using the GET method"); 35 out.println(" </BODY>"); out.println("</HTML>"); // 很明显这里就是在动态生成html内容,然后out对象就自动把这些内容返回给浏览器进行显示了 37 out.flush(); 38 out.close(); 39 }
-
参考博客: