第2章JSP和Servlet一、JSP1.JSP(JavaServerPages),是一种用于开发动态WEB页面技术,它在传统网页HTML文件(*.htm,*.html)中加入Java程序段和JSP标记,从而形成JSP文件(*.jsp)。2.JSP工作原理3.JSP语法a)注释:HTML注释:注释内容也被发送到客户端,客户浏览器端能够看到注释!--注释内容--JSP隐藏注释:注释内容不发送到客户端。%--注释内容--%b)声明变量和方法:%!declaration;[declaration;]…%如:%!intnumber=0;publicintgetNum(inti){returni;}%c)JSP表达式(用来在页面输出结果)%=表达式%如:%@pagelanguage=”java”import=”java.util.*”pageEncoding=”GBK”%body%!Randomrnd=newRandom();%得到的随机数是:%=rnd.nextInt(100)%/bodyd)JSP脚本段(Scriptlets)%Java代码%如:%@pagelanguage=”java”pageEncoding=”GBK”%body%introle=0;if(role==0){%p欢迎光临三扬!您的身份是——普通管理员/p%}else{%p欢迎光临三扬,您的身份是——系统管理员/p%}%/bodye)JSP编译指令,用来设置整个JSP页面相关属性%@指令名属性=”值”属性=”值”.....%i)page指令%@pagelanguage=”java”import=”java.util.*”pageEncoding=”GBK”%ii)include指令,在JSP页面中包含其他文件,如.jsp,.htm文件等。%@includefile=”路径名”%iii)tablib指令,允许用户使用标签库自定义新的标签%@tabliburi=”tablibUri”prefix=”tabPrefix”%uri用来表示标签库的地址,也就是告诉JSP容器怎么找到标签描述文件和标签库。prefix表示在JSP页面里引用这个标签的前缀。f)JSP动作指令(略)4)JSP内置对象(9个)a)request对象,用于获取客户端提交的数据,包括头信息、客户端地址、请求方式等。getParameter(Stringname)方法:获得表单提交的数据。b)response对象,用于向客户端发送数据。sendRedirect(Stringlocation)重新定向客户端的请求c)session对象,用来保存用户的会话信息和会话状态,session对象可理解为一个容器,用来存放用户的数据。setAttribute(Stringkey,Objectobj)//将对象obj添加到session对象中,并为添加对象指定一个索引值getAttribute(Stringkey)//获得key对应的对象removeAtrribute(Stringkey)删除key对应的对象d)application对象:用来存放用户间的共享数据。理解参照session对象。session和application对象都是容器,用来存放数据,区别是session对象是独享,一个用户对应着一个session对象;而application对象是公用,用户共用application对象。练习:编写一个jsp页面,输出1-100之和练习:使用JSP实现用户登录界面设计,如果用户名密码都是111,则返回成功界面,失败返回错误页面。double转换为String类型Double.toString(double);String转化为double类型Doulbe.parDoulbe(String);二、Servlet1.Servlet是使用Java语言编写的服务器端程序,它能够接受客户端的请求并产生响应。Servelt部署在Servlet容器内,当客户端请求时,WEB把请求传递给Servlet容器,容器会调用相应的Servelt。2.创建一个HttpServlet1)创建Servlet类,该类继承javax.servlet.http.HttpServlet类,并重写doGet()和doPost()方法publicclassHttpServletSampleextendsHttpServlet{protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{//业务逻辑处理代码…………}protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{this.doGet(req,resp);}}2)在web.xml文件中配置创建的Servlet类!--配置Servlet--servletservlet-nameServletSample/servlet-nameservlet-classsunyang.HttpServletSample/servlet-class/servlet!--配置Servlet映射路径--servlet-mappingservlet-nameServletSample/servlet-nameurl-pattern/httpServlet/url-pattern/servlet-mapping练习:在表单中输入100,点提交按钮后输出1-100之和,使用Servlet实现。3.Servlet生命周期注:a)上图中处理Http请求,调用的处理方法是doGet()或doPost()。b)Servlet并不是每处理完一个用户请求后就被销毁掉,实际上Servlet的销毁是由容器负责,如果不强制编程调用destroy()方法,Servlet会一直在容器内存在。c)Servlet的加载和实例化时机可以配置web.xml指定。!--配置Servlet--servletservlet-nameServletSample/servlet-nameservlet-classsunyang.HttpServletSample/servlet-classload-on-startup整数/load-on-startup/servlet正整数或0:表示服务器启动时就加载和初始化Servlet,值越小越会先加载负整数或不定义:表示Servlet被调用的时候加载这个Servlet。三、Filter1.Filter(过滤器),就是一种Filter接口的实现类,它可以根据应用程序的需要来拦截特定的请求和响应。2.工作原理3.创建一个过滤器1)定义一个javax.servlet.Filter接口的实现类,并实现init方法、doFilter方法以及destroy方法。publicclassIPFilterimplementsFilter{protectedFilterConfigfilterConfig;//FilterConfig可以获得web.xml中,以filter作为描述标签内的参数protectedStringfilterIP;//需要过滤的IP地址/*初始化过滤器*/publicvoidinit(FilterConfigconfig)throwsServletException{this.filterConfig=config;filterIP=config.getInitParameter(filterIP);//获取被过滤的IP地址if(filterIP==null)filterIP=;}/*过滤操作*/publicvoiddoFilter(ServletRequestreg,ServletResponseres,FilterChainchain)throwsIOException,ServletException{//利用RequestDispatcher对象,可以将请求转发给另外一个Servlet或JSP页面,甚至是HTML页面,来处理对请求的响应RequestDispatcherreqDispatcher=reg.getRequestDispatcher(error.jsp);StringremoteIP=reg.getRemoteAddr();//获取本地IP地址if(remoteIP.equals(filterIP)){//如果该IP地址被过滤,将转向错误页面reqDispatcher.forward(reg,res);}else{//否则将请求转发给过滤器链中的其他资源chain.doFilter(reg,res);}}/*销毁过滤器*/publicvoiddestroy(){this.filterConfig=null;}}2)在web.xml中配置过滤器!--配置过滤器--filterfilter-nameIPFilter/filter-namefilter-classsunyang.IPFilter/filter-classinit-paramparam-namefilterIP/param-nameparam-value192.168.70.82/param-value/init-param/filter!--配置过滤器的映射路径--filter-mappingfilter-nameIPFilter/filter-nameurl-pattern/*/url-pattern/filter-mapping注:/*表示请求网站下任意资源都将调用IPFilter过滤器四、Listener1.Listener(监听器),用于监听一些重要的事件发生,可以在事件发生前后做一些必要处理。2.监听器分类:ServletContext事件监听器:用于监测应用程序环境对象HttpSession事件监听器:用于监听用户会话对象ServletRequest事件监听器:用于监听请求信息对象。每个对象对应多个事件,这些事件的监听都有相应的监听接口负责,如Session对象的监听接口就有HttpSessionAttributeListener、HttpSessionListener、HttpSessionActivationListener和HttpSessionBindingListener。如Session对象的创建和销毁就由HttpSessionListener负责。3.创建一个监听器1)定义一个监听接口的实现类,实现相应监听事件的处理方法。publicclassOnlineListenerimplementsHttpSessionListener{privateintonlineCount;//定义一个代表在线人数的变量publicOnlineListener(){onlineCount=0;}/*会话创建时的处理*/publicvoidsessionCreated(HttpSessionEventsessionEvent){onlineCount++;sessionEvent.getSession().getServletContext().setAttribute(online,newInteger(onlineCount));//ServletContext表示一个应用程序环境对象。ServletContext对象提供对所有servlet共享属性的读写访问,即同一WEB应用的所有Servlet对象共享一个ServletContext,可以想象成一个web应用的共