Servlet

1、Applet是由Java语言编写的小应用程序,可以包含在HTML页面中,用<applet></applet>来标记。

2、Applet工作原理

  当浏览器遇到<applet></applet>这样的标签的时候,就会处理Applet程序,但前提是浏览器是支持Java的。

  当用户访问这样的网页的时候,Applet应用程序是被下载到客户的本地计算机内的,然后再执行。

  Applet具有设计精美用户界面的优势。

  Applet有很大的安全限制。

3、Servlet是在服务器上运行的小程序,而Applet是随着网页一起打包到客户端,在客户端上执行。由于是在服务器端运行,所以可以用java语言来实现,在通信量大的情况下,javaServlet的执行速度是快于CGI(公共网关接口)的。

4、最早支持Servlet的是JSP,后来很多技术都支持了Servlet API接口,Servlet可以交互式地浏览和修改数据。

5、Servlet的实现过程

  客户端发送请求到服务器端;

  服务器将请求发给Servlet;

  Servlet生成相应内容并将响应内容发送给服务器;

  服务器将响应返回给客户端。

6、Servlet只初始化一次,因为只有一个对象。

7、Servlet和Applet的相同的和不同点:相同点是他们都不是独立的应用程序,没有main()主函数,它们都是被另外的程序(容器)调用的,不同点是Servet没有图形用户界面,在服务器端运行,而Applet有很好的图形用户界面并且与浏览器在客户端运行。

8、Servlet和CGI:前者比后者有更好的性能、移植性和经济性。

9、Servlet常见的容器:Apache、Websphere等等,提供Servlet功能的服务器叫Servlet容器。容器好比是桌面应用程序对于的操作系统一样。

10、Servlet与JSP:Servlet是一句一句地输出HTML语句,而JSP像PHP,ASP那样是镶嵌型的语言。Servlet方便与写业务层,而JSP方便于写表现层。一般,JSP只用于写表现层的东西,而业务层的东西用javaBean来写。可以说JSP是Servlet的替代方案,但一般的学习者还是需要从Servlet开始学,然后学JSP,最后是JSP+BEAN。

11、Servlet可以方便地对Web中的HTTP请求进行处理,Servlet主要用于处理各种业务逻辑。Servlet主要应用与B/S结构的开发中。通常情况下我们编写的Servlet对象都继承于HttpServlet。

12、创建Servlet有两种方法:一是创建一个Java类,然后实现Servlet接口或者继承于Servlet接口的实现类(HttpServlet)来实现;另一种是通过IDE集成开发环境。继承HttpServlet实现的Servlet对象重写了HttpServlet类中的部分方法。

13、创建Servlet后还需要对其进行配置,目的是将创建的Servlet注册到Servlet容器之中,以方便Servlet容器对Servlet的调用。Servlet3.0及以后版本中可以在web.xml和注解中配置。前者需要自己配置,后者在Eclipse下自动完成配置。前者如下:

<!--注册Servlet-->
<servlet>
    <!--Servlet描述信息-->
    <description>This is my first Servlet</description>
    <!--Servlet的名称-->
    <servlet-name>FirstServlet</servlet-name>
    <!--Servlet类的完整类名-->
    <servlet-class>com.joeshine.FirstServlet</servlet-class>
</servlet>
<!--Servlet映射-->
<servlet-mapping>
    <!--Servlet名称-->
    <servlet-name>FirstServlet</servlet-name>
    <!--访问URL地址-->    
    <url-pattern>/FirstServlet</url-pattern>
</servlet-mapping>

14、在Servlet中实现页面转发:利用RequestDispatcher接口实现。该接口有两个方法:

  forward()方法:用于将请求转发到服务器上的另一个资源,可以是Servlet、JSP或HTML;

  include()方法:用于把服务器上的另一个资源(Servlet,JSP,HTML)包含到响应中。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        RequestDispatcher requestdispatcher=request.getRequestDispatcher("main.jsp");
        requestdispatcher.forward(request, response);
    }

15、用Servlet处理表单数据

ServletFormDeal.java文件

 1 package com.joeshine;
 2 
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5 import javax.servlet.ServletException;
 6 import javax.servlet.annotation.WebServlet;
 7 import javax.servlet.http.HttpServlet;
 8 import javax.servlet.http.HttpServletRequest;
 9 import javax.servlet.http.HttpServletResponse;
10 
11 /**
12  * Servlet implementation class ServletFormDeal
13  */
14 @WebServlet("/ServletFormDeal")
15 public class ServletFormDeal extends HttpServlet {
16     private static final long serialVersionUID = 1L;
17        
18     /**
19      * @see HttpServlet#HttpServlet()
20      */
21     public ServletFormDeal() {
22         super();
23         // TODO Auto-generated constructor stub
24     }
25 
26     /**
27      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
28      */
29     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
30         // TODO Auto-generated method stub
31         request.setCharacterEncoding("UTF-8");        //设置请求编码,防止中文乱码
32         String person=request.getParameter("person");    //获取留言人
33         String content=request.getParameter("content"); //获取留言内容
34         response.setContentType("text/html;charset=utf-8");//设置内容类型
35         PrintWriter out=response.getWriter();            //创建输出流
36         out.println("<html><head><title>获取留言信息</title></head><body>");
37         out.println("留言人:&nbsp;"+person+"<br><br>");
38         out.println("留言内容:"+content+"<br><br>");
39         out.println("<a href='index.jsp'>返回</a>");
40         out.println("</body></html>");
41         out.close();                                  //关闭输出流
42     }
43 
44 }

index.jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用Servlet处理表单信息</title>
</head>
<body>
<form name="form1" method="post" action="ServletFormDeal">
留言人:&nbsp;<input type="text" name="person"><br><br>
留言内容:<textarea name="content" rows="6" cols="30" ></textarea><br><br>
<input type="submit" name="submit1" value="提交">
<input type="reset" name="submit2" value="重置">
</form>
</body>
</html>

16、Servlet过滤器:它和Servlet十分相似,是针对客户端(浏览器)请求资源而言的。它主要是将客户端(浏览器)的请求进行过滤后转交给下一个资源。其实质上就是在Web应用服务器上的Web应用组件,用于拦截客户端(浏览器)和目标资源的请求。过滤器可以有多个构成过滤器链,通过层次请求转交后达到目标资源,然后层层响应传到客户端。

17、过滤器的核心对象:过滤器的对象都放在javax.servlet包中,Filter接口对象、FilterConfig接口对象、FilterChain接口对象。每一个过滤器都要直接或间接地实现Filter接口对象,其包括三个方法init()初始化过滤器、doFilter()对请求进行过滤处理、destroy()销毁方法;FilterConfig对象由Servlet容器实现,主要用于获取过滤器中的配置信息,其有四个方法;FilterChain接口对象也由Servlet容器实现,其只有一个方法,就是将过滤后的请求传递给下一个过滤器。

18、过滤器的创建和配置,类似于Servlet

 1 package com.joeshine;
 2 //过滤器的创建和配置
 3 import java.io.IOException;
 4 import javax.servlet.Filter;
 5 import javax.servlet.FilterChain;
 6 import javax.servlet.FilterConfig;
 7 import javax.servlet.annotation.*;
 8 import javax.servlet.ServletException;
 9 import javax.servlet.ServletRequest;
10 import javax.servlet.ServletResponse;
11 import javax.servlet.annotation.WebFilter;
12 
13 /**
14  * Servlet Filter implementation class FirstFilter
15  */
16 /*过滤器的配置代码,filterName属性是指定Servlet过滤器名,urlPatterns属性用于指定哪些URL应用该过滤器,
17 ,如果所有页面均使用则设为"/*",iniParams属性用于指定初始化参数。这些属性不是必须的,可以在需要的时候选择使用
18 */
19 @WebFilter(filterName="/FirstFilter",
20 urlPatterns={"/*"},
21 initParams={@WebInitParam(name="mood",value="awake")})
22 public class FirstFilter implements Filter {
23 
24     /**
25      * Default constructor. 
26      */
27     public FirstFilter() {
28         // TODO Auto-generated constructor stub
29     }
30 
31     /**
32      * @see Filter#destroy()
33      */
34     public void destroy() {
35         // TODO Auto-generated method stub
36     }
37 
38     /**
39      * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
40      */
41     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
42         // TODO Auto-generated method stub
43         // place your code here,放置过滤器代码的地方
44 
45         // pass the request along the filter chain
46         chain.doFilter(request, response);
47     }
48 
49     /**
50      * @see Filter#init(FilterConfig)
51      */
52     public void init(FilterConfig fConfig) throws ServletException {
53         // TODO Auto-generated method stub
54     }
55 
56 }

19、使用过滤器实现网站访问次数的功能

CountFilter.java

 1 package com.joeshine;
 2 //创建CountFilter类过滤器,实现javax.servlet.FilterJiek ,用于实现统计网站访问人数
 3 import java.io.IOException;
 4 import javax.servlet.annotation.*;
 5 import javax.servlet.ServletContext;
 6 import javax.servlet.FilterChain;
 7 import javax.servlet.FilterConfig;
 8 import javax.servlet.ServletException;
 9 import javax.servlet.ServletRequest;
10 import javax.servlet.ServletResponse;
11 import javax.servlet.annotation.WebFilter;
12 
13 /**
14  * Servlet Filter implementation class Filter
15  */
16 //在过滤器配置信息里初始化count计数器参数,保证过滤器编译后count还可以更改
17 @WebFilter(filterName="/Filter",
18         urlPatterns="/index.jsp",
19         initParams={
20                 @WebInitParam(name="count",value="3000")
21 })
22 public class CountFilter implements javax.servlet.Filter {
23 
24     /**
25      * Default constructor. 
26      */
27     //定义一个计数器变量
28     private int count;
29     public CountFilter() {
30         // TODO Auto-generated constructor stub
31     }
32 
33     /**
34      * @see Filter#destroy()
35      */
36     public void destroy() {
37         // TODO Auto-generated method stub
38     }
39 
40     /**
41      * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
42      */
43     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
44         // TODO Auto-generated method stub
45         //doFilter方法拦截客户端的请求
46         // place your code here
47         //计数器自加运算
48         count++;
49         //用FiterConfig的获取过滤器
50         ServletContext context=request.getServletContext();
51         //将来访数量值放入ServletContext中
52         context.setAttribute("count", count);
53         //向下传递过滤器
54         // pass the request along the filter chain
55         chain.doFilter(request, response);
56     }
57 
58     /**
59      * @see Filter#init(FilterConfig)
60      */
61     public void init(FilterConfig fConfig) throws ServletException {
62         // TODO Auto-generated method stub
63         //获取初始化参数
64         String param=fConfig.getInitParameter("count");
65         //将字符串转换为Int型
66         count=Integer.valueOf(param);
67     }
68 
69 }

index.jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>
    欢迎光临,<br>
    您是本站的第【<%=application.getAttribute("count") %>
    】位访客!
</h2>
</body>
</html>

20、Servlet监听器:Servlet监听器和Servlet过滤器的很多特性是一致的,甚至与过滤器的很多概念也是一致的。监听器的作用是坚挺Web容器的有效期事件,因此它是由容器管理的。Servlet和JSP中有8个Listener接口和6个Event类。功能是监听由于Web应用中状态改变而引起的Servlet容器产生的相应事件,然后接受并处理这些事件。

21、Servlet监听器分为几大类

  1)  Servlet上下文监听可以监听ServletContex对象

    ServletContextListener接口:该接口存放在javax.servlet包中,主要监听ServletContext对象的创建和删除,它提供两个方法,参数是Event类,称为“Web应用程序的生命周期方法”。

    ServletAttributeListener接口:存放在javax.servlet包中,主要监听ServletContext属性的增加、删除、修改。该接口提供了三个方法,参数是Event类。

  2)   HTTP会话监听:主要用于监听信息。4个接口可以使用。

    HttpSessionListener接口:用于监听HTTP会话的创建、销毁。提供了两个方法,参数是HttpSessionEvent类。

    HttpSessionActivationListener接口:用于监听HTTP会话active、passivate的情况。提供了三个方法,参数是HttpSessionBindingEvent类,该类有三个方法。

    HttpBindingListener接口:用于监听HTTP会话中对象的绑定信息,它是唯一一个不需要在web.xml中设定Listener的。提供两个方法,参数是HttpSessionBindingEvent类。

    HttpSessionAttributeListener接口:用于监听HTTP会话中属性的设置请求。提供两种方法,参数是HttpSessionEvent类。

  3)  HTTP请求监听:监听客户端的请求,一旦可以在监听程序中获取客户端的请求,就可以对请求统一处理。

    ServletRequestListener接口:提供了两个方法;

    ServletRequestAttributeListener接口:提供了三种方法。

22、Servlet监听器实例:统计在人数

UserInfoList.java

 1 package com.joeshine;
 2 
 3 import java.util.Vector;
 4 
 5 public class UserInfoList {
 6     private static UserInfoList user = new UserInfoList();
 7     private Vector<String> vector = null;
 8 
 9     /*
10      * 利用private调用构造函数, 防止被外界产生新的instance对象
11      */
12     public UserInfoList() {
13         this.vector = new Vector<>();
14     }
15 
16     /* 外界使用的instance对象 */
17     public static UserInfoList getInstance() {
18         return user;
19     }
20 
21     /* 增加用户 */
22     public boolean addUserInfo(String user) {
23         if (user != null) {
24             this.vector.add(user);
25             return true;
26         } else {
27             return false;
28         }
29     }
30 
31     /* 获取用户列表 */
32     public Vector<String> getList() {
33         return vector;
34     }
35 
36     /* 移除用户 */
37     public void removeUserInfo(String user) {
38         if (user != null) {
39             vector.removeElement(user);
40         }
41     }
42 }

UserInfoTrace.java类

 1 package com.joeshine;
 2 
 3 import javax.servlet.http.HttpSessionBindingEvent;
 4 
 5 public class UserInfoTrace implements
 6         javax.servlet.http.HttpSessionBindingListener {
 7     private String user;
 8     private UserInfoList container = UserInfoList.getInstance();    //获得UserInfoList类的对象
 9 
10     public UserInfoTrace() {
11         user = "";
12     }
13 
14     // 设置在线监听人员
15     public void setUser(String user) {
16         this.user = user;
17     }
18 
19     // 获取在线监听
20     public String getUser() {
21         return this.user;
22     }
23     //当Session有对象加入时执行的方法
24     public void valueBound(HttpSessionBindingEvent arg0) {
25         System.out.println("[ " + this.user + " ]上线");
26     }
27     //当Session有对象移除时执行的方法
28     public void valueUnbound(HttpSessionBindingEvent arg0) {
29         System.out.println("[ " + this.user + " ]下线");
30         if (user != "") {
31             container.removeUserInfo(user);
32         }
33     }
34 }

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户登录</title>
<script language="javascript">
    function checkEmpty(form) {
        for (i = 0; i < form.length; i++) {
            if (form.elements[i].value == "") {
                alert("表单信息不能为空");
                return false;
            }
        }
    }
</script>
<style type="text/css">
section {
    margin:0 auto auto auto;            /*设置外边距*/
    width:363px;                        /*设置页面宽度*/
    clear:both;                        /*设置两侧均不可以有浮动内容*/
    background-image:url(images/login.png);            /*设置背景图片*/
    height:224px;                        /*设置高度*/
}
form{
    padding-left: 80px;        /*设置左内边距*/
    padding-top: 120px;        /*设置上内边距*/
}
body{
    margin: 0px;
}
</style>
</head>
<body>
<section>

 
  <form name="form" method="post" action="showuser.jsp" onSubmit="return checkEmpty(form)">
    <input type="text" name="user">
    <input type="submit" name="Submit" value="登录">
  </form>

</section>
</body>
</html>

logout.jsp

<%@ page contentType="text/html; charset=gb2312" language="java" errorPage="" %>
<%
         session.invalidate();
 out.println("<script>parent.location.href='index.jsp';</script>");
%>

showUser.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.*"%>
<%@ page import="com.mingrisoft.*"%>
<%
    UserInfoList list = UserInfoList.getInstance();//获得UserInfoList类的对象
    UserInfoTrace ut = new UserInfoTrace();//创建UserInfoTrace类的对象
    request.setCharacterEncoding("UTF-8");//设置编码为UTF-8,解决中文乱码
    String name = request.getParameter("user");    //获取输入的用户名
    ut.setUser(name);    //设置用户名
    session.setAttribute("list", ut);
    list.addUserInfo(ut.getUser());    //添加用户到UserInfo类的对象中
    session.setMaxInactiveInterval(30);//设置Session的过期时间为30秒
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>在线用户列表</title>

<style type="text/css">
section {
    margin:0 auto auto auto;            /*设置外边距*/
    width:311px;                        /*设置页面宽度*/
    clear:both;                        /*设置两侧均不可以有浮动内容*/
    background-image:url(images/listbg.png);            /*设置背景图片*/
    height:254px;                        /*设置高度*/
}
textarea{
    border: none;    /*设置不显示边框*/
    background-color: #FDF7E9;    /*设置背景颜色*/
    margin-left: 20px;
    margin-top: 100px;
    padding: 0px;    /*设置内边距*/
}
body{
    margin: 0px;    /*设置外边距*/
}
</style>
</head>
<body>
<section>
<div>
    <textarea rows="10" cols="34"><%
        Vector vector = list.getList();
        if (vector != null && vector.size() > 0) {
            for (int i = 0; i < vector.size(); i++) {
                out.println(vector.elementAt(i));
            }
        }
    %>
    </textarea>
</div>
</section>
</body>
</html>

23、编写一个字符编码过滤器,使得所有的表单数据输入支持中文,并编写一个Servlet类输出request获取的数据。实例为添加图书信息并输出:

index.jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>首页</title>
<style type="text/css">
    ul{
        list-style:none;
    }
    li{
        padding:4px;
    }
</style>
</head>
<body>
<!-- 实现图书信息的添加,并创建字符编码过滤器,避免中文乱码 -->
<form name="form" method="post" action="AddServlet">
<ul>
    <li>图书编号:<input type="text" name="id"></li>
    <li>图书名称:<input type="text" name="name"></li>
    <li>&nbsp;&nbsp;格:<input type="text" name="price"></li>
    <li>&nbsp;&nbsp;者:<input type="text" name="author"></li>
    <li><input type="submit" name="submit" value="添加"></li>
</ul>
</form>
</body>
</html>

CharactorFilter.java类(字符编码过滤器)

 1 package com.joeshien;
 2 //创建字符编码过滤器类CharactorFilter
 3 import java.io.IOException;
 4 import javax.servlet.annotation.*;
 5 import javax.servlet.Filter;
 6 import javax.servlet.FilterChain;
 7 import javax.servlet.FilterConfig;
 8 import javax.servlet.ServletException;
 9 import javax.servlet.ServletRequest;
10 import javax.servlet.ServletResponse;
11 import javax.servlet.annotation.WebFilter;
12 
13 /**
14  * Servlet Filter implementation class CharactorFilter
15  */
16 @WebFilter(filterName="/CharactorFilter",
17             urlPatterns={"/*"},
18             initParams={
19                     @WebInitParam(name="encoding",value="UTF-8")
20             })
21 public class CharactorFilter implements Filter {
22     String encoding=null;        //定义字符编码字符串变量
23     /**
24      * Default constructor. 
25      */
26     public CharactorFilter() {
27         // TODO Auto-generated constructor stub
28     }
29 
30     /**
31      * @see Filter#destroy()
32      */
33     public void destroy() {
34         // TODO Auto-generated method stub
35         encoding=null;
36     }
37 
38     /**
39      * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
40      */
41     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
42         // TODO Auto-generated method stub
43         // place your code here
44         if(encoding!=null)                    //判断字符编码是否为空
45         {
46             //设置请求的编码格式
47             request.setCharacterEncoding(encoding);
48             //设置响应response的编码
49             response.setContentType("text/html; charset="+encoding);
50         }
51         // pass the request along the filter chain
52         chain.doFilter(request, response);
53     }
54 
55     /**
56      * @see Filter#init(FilterConfig)
57      */
58     public void init(FilterConfig fConfig) throws ServletException {
59         // TODO Auto-generated method stub
60         encoding=fConfig.getInitParameter("encoding");    //获取初始化参数
61     }
62 
63 }

AddServlet.java(增加图书信息的Servlet类)

 1 package com.joeshien;
 2 
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5 import javax.servlet.ServletException;
 6 import javax.servlet.annotation.WebServlet;
 7 import javax.servlet.http.HttpServlet;
 8 import javax.servlet.http.HttpServletRequest;
 9 import javax.servlet.http.HttpServletResponse;
10 
11 /**
12  * Servlet implementation class AddServlet
13  */
14 @WebServlet("/AddServlet")  //配置SERVLET
15 public class AddServlet extends HttpServlet {
16     private static final long serialVersionUID = 1L;
17        
18     /**
19      * @see HttpServlet#HttpServlet()
20      */
21     public AddServlet() {
22         super();
23         // TODO Auto-generated constructor stub
24     }
25 
26     /**
27      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
28      */
29     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
30         // TODO Auto-generated method stub
31         doPost(request,response);  //处理GET请求
32     }
33 
34     /**
35      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
36      */
37     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
38         // TODO Auto-generated method stub
39         PrintWriter out=response.getWriter();               //获取PrintWriter
40         String id=request.getParameter("id");               //获取图书编号
41         String name=request.getParameter("name");        //获取图书名称
42         String price=request.getParameter("price");        //获取图书价格
43         String author=request.getParameter("author");    //获取图书作者
44         out.print("<h2>图书信息添加成功</h2>");             //输出图书信息
45         out.print("图书编号:"+id+"<br><br>");
46         out.print("图书名称:"+name+"<br><br>");
47         out.print("价&nbsp;&nbsp;格:"+price+"<br><br>");
48         out.print("作&nbsp;&nbsp;者:"+author);
49         out.flush();
50         out.close();
51     }
52 
53 }

    

  

原文地址:https://www.cnblogs.com/joeshine/p/4432447.html