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("留言人: "+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"> 留言人: <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>价 格:<input type="text" name="price"></li> <li>作 者:<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("价 格:"+price+"<br><br>"); 48 out.print("作 者:"+author); 49 out.flush(); 50 out.close(); 51 } 52 53 }