java Web指的是用Java技术进行基于B/S模式的动态web应用系统的开发。本部分主要学习web服务器搭建、JSP基础语法、使用JDBC和JavaBean操作数据库,Servlet处理请求,第三方控件和分页查询、EL表达式和JSTL标签、过滤器和监听器配置。要学好Java web技术,必须要理解MVC模式。
MVC模式是一种使用模型-视图-控制器设计创建 Web 应用程序的模式。最典型的MVC就是JSP + servlet + JavaBean的模式。Javabean的作用是负责业务逻辑和封装数据,包括entity层、dao层、service层,其中dao层是数据访问层,负责访问数据库。entity是实体层,负责封装数据,而service层是业务逻辑层, 负责逻辑业务,可以直接调用dao层代码使功能模块化。servlet作用是负责接收请求,调用相应Service方法,决定如何响应,本身不做业务逻辑。jsp页面是由html+java代码编写的,作用就是制作动态可视化页面。
一、java web简介
1、B/S架构 :Web应用程序 采用请求、响应模式进行交互
2、C/S架构 :桌面应用程序 嵌入式程序:安卓、苹果
3、URL:统一资源定位符(协议+主机地址+目标资源地址+参数)
4、动态网页制作:
JSP(JAVA SERVER PAGE):适合大型的,企业级的web应用程序开发
Asp .net:简单易学,但安全性以及跨平台性差
PHP:简单高效,成本低,适合中小型企业web应用开发(lamp:linux+apache+mysql+php )
5、Web服务器
Microsoft:IIS Apache:Tomcat Oracle:WebLogic IBM:WebSphere Nginx
Tomcat服务器:
文件夹:/bin /conf /lib(jar文件) /logs /temp
/webapps(web应用发布后的文件:WEB-INF .jsp) /work (由JSP生成的servlet文件)
6、WEB-INF:WEB应用的安全目录,只有服务端可以访问
1、web.xml项目部署文件
2、classes(放.class文件) 3、lib(放.jar文件)
7、把任意名称.jsp作为项目欢迎页,配置方法:在web.xml文件添加如下代码
8、MyEclipse简单配置:
在preference中java目录添加JRES,在myeclipse目录severs目录配置tomcat。
修改JSP中默认使用的字符编码格式为utf-8
9、Myeclipse编写java web程序步骤
1、创建java web项目。生成WebRoot、WEB-INF文件夹
2、编写jsp文件
3、部署和发布web app。点击deploy
4、启动tomcat 7.x服务
5、打开浏览器访问项目文件
10、java web项目目录结构:java源程序src、类库文件、web项目根目录
11、项目虚拟路径:在浏览器打开的项目地址
右键打开项目属性properties、选择myeclipse、选择web标签。
修改web context-root路径、重新部署web app ,启动tomcat服务,实现虚拟路径访问访问
12、修改tomcat服务器默认端口
修改conf/server.xml文件:8080修改为8088、8888等(范围1024~65535)
13、web程序常见错误
404错误—找不到访问的页面或资源(url输入错误;将页面放在web-inf下;外部启动tomcat,未部署项目)
500错误—JSP页面代码错误
页面无法显示—未启动Tomcat
二、jsp基础语法
1、jsp:java sever pages :是一种运行在服务端的java页面。采用HTML语言嵌套java代码实现jsp开发web app
2、jsp页面组成:
指令、表达式、小脚本、声明、注释、静态内容
jsp指令:
page 位于页面顶端 <%@ page language=”java” import=”java.util.*” contentType=”text/html; charset=UTF-8” pageEncoding=”UTF-8”%>
include 外部文件嵌入到jsp文件中,并解析
taglib 自定义并使用新标签
jsp注释:
1、html注释:客户端可见
2、jsp注释:客户端不可见 <%–jsp注释 –%>
3、jsp脚本注释:客户端不可见<% //单行注释 /*多行注释*/ %>
jsp脚本:在jsp页面执行的java代码
<% out.println(“大家好”)%>
jsp声明:在jsp页面定义变量或方法
<%! String s=”张三” %> 注意声明的是全局变量
<%! int add(int x,int y){return x+y} %>
jsp表达式:
<%=add(10,5) %> //调用上面的方法,并输出
3、JSP页面生命周期:
用户发出请求(.jsp文件)→如果是第一次请求,通过jsp引擎将jsp文件转换为Servlet,编译生成字节码.并执行jspInit()方法实现初始化→访问字节码文件。若用户不是第一次请求,会直接访问生成的字节码文件,最后执行jspService()方法
jspService()方法:处理客户端请求,每一次请求,jsp引擎都会创建新的线程来处理。请求是多个的,所以涉及到多线程编程,需要注意同步问题
三、JSP内置对象
web容器创建的一组对象,不使用new关键字创建就可以使用的对象,有九大内置对象:
请求对象:request 相应对象:response 输出对象:out 会话对象:session
应用程序对象:application 页面上下文对象:pageContext
页面对象:page 配置对象:config 异常对象:exception
1、web程序的请求响应模式: request\response 客户端发出请求,服务端给予响应
2、缓冲区:是内存的一块区域用来保存临时数据 比如乘米饭的碗
3、out对象:是jspWriter类的实例,是客户端输出内容常用对象
方法: println() 打印字符串 clear() 清除缓冲区的内容,如果在flush之后调用会抛出异常 close()关闭输出流
clearBuffer()清除缓冲区的内容,如果在flush之后调用不会抛出异常 flush()将缓冲区的内容输出到客户端
getBufferSize() 返回缓冲区的字节大小 getRemaining()返回缓冲区还剩余多少可用 isAutoFlush()当缓冲区满时,是自动清空还是抛出异常
4、表单提交方式method:
get(使用get参数出现在URL中,适合提交数据量不大,安全性不高的数据) post(相反,效率没get高。主要用于注册、修改、上传等功能)
5、request对象:是HttpServletRequest类的实例,用来封装客户端的请求信息
方法:
1、String getParameter(); 返回name指定参数的参数值(获取表单提交的数据)
String[] getParameterValues();返回包含name参数的所有值的数组
2、void setAttribute(String,Object) 存储请求的属性 (注意是键值对)
object getAttribute(String name) 返回指定属性的值
3、void setCharacterEncoding() 指定请求的编码方式(解决post提交中文乱码)
String getCharacterEncoding() 返回字符编码的方式
4、getRequestDispatcher(“path”).forward(request,response)用于转发请求
getContentLength()返回请求的文件长度 getRemoteAddr()返回请求客户端的IP地址
getRealPath()请求的真实绝对路径 getContextPath() 请求的上下文路径
getContentType() 得到请求体的MIME类型 getProtocol() 返回请求协议类型及版本号
getServerName()返回接受请求的服务器主机名 getServerPort()返回接受请求的服务器端口号
get请求!URL中文传参出现乱码,需要修改服务器的server.xml文件,在
6、response对象:是HttpServletResponse类的实例。包含了响应客户端请求的有关信息
方法:
setCharacterEncoding() 设置响应的编码方式
getCharacterEncoding() 返回响应所用的编码
setContentType() 设置响应的MIME类型
PrintWriter getWriter() 返回输出流(到客户端)对象
sendRedirect()重新定向客户端的请求
7、请求重定向与请求转发的区别
重定向:客户端行为,reponse.sendRedirect(“path”),是两次请求,前一次请求对象不会被保存,地址栏的URL地址会改变
转发:服务器行为,
request.getRequestDispatcher(“path”).forward(request,response),是一次请求,转发后请求对象会保存,地址栏URL不会改变
8、session对象:是HttpSeesion类的实例,是保存用户会话状态的一种机制
在服务器内存中保存着不同用户的session。 在第一个jsp页面被加载时自动创建seesion,完成会话期管理。
方法:long getCreationTime()返回session创建的时间(ms)
String getId()返回创建session时jsp引擎为它设置的唯一ID号
setAttribute(String name,Object value)使用指定名称将对象绑定到此对话
getAttribute(String name)返回与此会话中的指定名称绑定在一起的对象,若无返回null
String[] getValueNames()返回一个包含此session中所有可用属性的数组
int setMaxInactiveInterval() 设置两次请求间隔多长时间此session失效(s)
int getMaxInactiveInterval() 返回两次请求间隔多长时间此session失效(s)
session生命周期就是客户打开浏览器并连接服务器开始,到关闭浏览器离开这个服务器结束。经历session创建,活动,销毁三个阶段
session活动阶段:
属于同一会话的情况:通过超链接打开页面;当前会话页面没有全部关闭,而重新打开新的浏览器窗口访问同一项目资源。
注意:关闭浏览器,重新打开页面,会创建新的session。但是旧的sessionId仍存在服务端,只是再没有客户端携带它然后交付服务端校验
session销毁方式:
1、调用session.invalidate() session.removeAttribute()
2、Session设置超时方式:tomcat默认超时时间为30min;
使用session.setMaxInactiveInterval();在web.xml配置超时时间
3、服务器重新启动
9、application对象:是ServletContext类的实例。实现了用户间数据共享,可存放全局变量。存活于服务器的开启和关闭
方法:
setAttribute(String name,Object value)使用指定名称将对象绑定到此对话
getAttribute(String name)返回与此会话中的指定名称绑定在一起的对象,若无返回null
Enumeration getAttributeNames(String name)返回所有可用属性名的枚举
getsServerInfo()返回JSP引擎及版本号
10、page对象:是java.long.Object类的实例,指当前jsp页面本身,相当于类中的this指针
方法:
getClass()返回此Object的类 hashcode()返回此Object的hash码
equals()判断此Object是否与指定的Object对象相等
copy() 把此Object拷贝到指定的Object对象中 clone() 克隆此Object对象
toString()把此Object对象转换为String类对象
notify()唤醒一个等待的线程 notifyAll()唤醒所有等待的线程
wait(int timeout)使一个线程处于等待直到timeout结束或被唤醒
wait()使一个线程处于等待直到被唤醒
11、pageContext对象:相当于页面中所有功能的集大成者,提供了对jsp页面内所有对象及名字空间的方法
方法:
JspWrite getOut()返回当前客户端响应被使用的JspWriter流
HttpSession getSession() 返回当前页中的HttpSession对象
Object getPage() 返回当前页的Object对象
ServletRequest getRequest()返回当前页的ServletRequest对象
ServletResponse getResponse()返回当前页的ServletResponse对象
setAttribute(String name,Object attribute) 设置属性及属性值 getAttribute()返回某属性的属性值
int getAttributeScope()返回某属性的作用范围
forward(String relativeUrlPath)使当前页面转发到另一个页面
include(String relativeUrlPath)在当前位置包含另一个文件
12、config对象:是在一个servlet初始化时,用于JSP引擎向它传递信息(属性和值)
方法:
ServletContext getServletContext()返回含有服务器相关信息的ServletContext对象
String getInitParameter()返回初始化参数的值
Enumeration getInitParameterNames()返回Servlet初始化所有参数的枚举
13、Exception对象:是java.lang.Throwable的对象,当页面运行异常会产生该对象。
如果一个JSP页面要应用此对象,需要把isErrorPage设为true
getMessage()获得异常消息 toString()获得异常的简单描述信息
printStackTrace()显示异常及其栈轨迹
Throwable FillInStackTrace()重写异常的执行栈轨迹
14、cookie(在客户端保存)
添加数据:public void addCookie(Cookie cookie)
获取数据: public Cookie[ ] getCookies()
设置有效期:public void setMaxAge(int expiry)
创建:Cookie cookie = new Cookie(“存储的对象”, 对象的值);
设置存储时间: cookie.setMaxAge(60*60); expiry为0表示删除cookie,-1或不写表示cookie会在当前窗口关闭后失效
添加cookie: response.addCookie(cookie);(服务器端要求存储)
获取cookie: Cookie [ ] cs=request.getCookies();(客户端获取)
注:中文乱码
先编码:URLEncoder.encode(“要转码的对象,“编码格式”)
再解码:URLDecoder.decode(“要解码的对象,“编码格式”)
15、session与cookie区别:
Session在服务器端保存信息,保存的是Object类型,随会话的结束而销毁数据
一般保存重要的信息。
Cookie在客户端保存用户信息,保存的是String类型,可以长期保存在客户端,一般保存不重要的信息。
四、使用JDBC和JavaBean操作数据库
1、JDBC(JAVA数据库连接技术): 实现java程序对各种数据库的访问。使用java.sql、javax.sql包中的类和接口(JDBC API)。
面向接口的编程:仅能调用接口提供的开放的方法。
优点:不必为不同数据库编写不同程序,实现只需要加载不同数据库驱动即可
原理:JDBC API定义类和接口 DriveManager管理不同的JDBC驱动。JDBC驱动实现各类与接口,负责连接不同类型的数据库。
编写的包:
Dao包:存放接口和类,负责数据库相关事情。
Dao.impl包 : dao接口实现类
entity包:存放实体类,封装所有表数据
Service包: 存放的接口和类,对Dao的方法进行封装和调用,负责与业务逻辑相关的操作。所有service层称业务逻辑层
Service.impl包:service接口实现类
Test包:存放测试类
util包:分页工具类 properties配置文件
2、JavaBean:是一个java类,可以重用。解决代码重复编写,减少代码冗余,功能区分明确,提高代码的可维护性
JavaBean设计原则:公有类、无参的公有的构造方法、属性私有、getter和setter方法
作用:封装业务(dao、service接口实现类);封装数据(entity)
3、JDBC编程步骤
1、Class.forName(driver);加载驱动
2、con=DriverManager.getConnection(url name password)获得数据库连接
3、执行sql 注意Statement 和PreparedStatement的区别
String sql=”select * from news “; stat=connection.createStatement();
rs=stat.executeQuery(sql);
4、处理结果 System.out.println();
5、并释放资源 ?.close();
Statement与PreparedStatement区别:
PreparedStatement—预编译,声明时携带SQL参数,适合多参数请求
SQL语句使用“”作为数据占位符;使用setXxx()方法设置数据
4、升级Dao层,使用database.properties配置文件存储数据库信息
将相似功能的代码抽取封装成方法,减少代码冗余。将数据库抽取成接口,降低架构耦合性。
方法:编写BaseDao基类、Dao接口及DaoImp实现类。
5、使用Tomcat配置数据源,利用JNDI获取数据源,连接数据库
修改 \apache-tomcat-7.0.69\conf\context.xml配置文件,添加如下
auth=”container” type=”javax.sql.DataSource”
maxActive=”100” maxIdle=”30” maxWait=”10000” username=”root”
password=”123456” driverClassName=”com.mysql.jdbc.Driver”
url=”jdbc:mysql://127.0.0.1:3306/news”/>
如果oracle,修改username password classname=”oracle.jabc.OracleDriver”
url:”jdbc:oracle:thin:@localhost:1521:news”
连接池:存放连接对象,并管理连接对象,根据请求时对象是否空闲分配连接对象
数据源:由Tomcat容器创建连接对象,统一放到连接池中管理,用来连接数据库,获得连接对象
6、JNDI(java命名和目录接口): 将名字和对象绑定,通过JNDI接口对象的lookup()方法获取创建好的数据源
Context context = new InitialContext();//初始化上下文
DataSource ds=(DataSource) context.lookup(“java:comp/env/jdbc/news”)
connection=ds.getConnection();//获取存放在连接池的数据源并连接数据库
7、通过JavaBean封装数据和传递数据
分层架构思想:mysql—dao—service–jsp
entity层,实体类(News\User\NewsCategory)。
Dao层(BaseDao\NewsDao)包括接口和实现类。
Service层,业务逻辑层(UserService(register))。
8、JSP动作标签
与存取javabean有关的动作标签:
a创建javabean实例,并指定它的名称和作用范围
b设置javabean(对象name)的属性(property)的值
c
JSP1.2常用的基本动作标签
JSP2.0新增的动作标签
9、Include指令与动作标签
Include指令 静态包含页面,包含的是实际内容,在编译期页面才被执行
被包含页面内容发生变化,包含页面会重新编译。<%@ include file=”x.jsp” %>
动作标签:include、forward param
Include:
forward:
param:
五、第三方控件与分页查询
一、掌握commons-fileupload文件上传组件(属于java的)
首先导入commons-fileupload.jar和commons-io-2.4.jar包
1、提交页面(creat页面):
①input type = text 应改为 type = file
②必须是post提交方式
③enctype=”multipart/form-data”告诉服务器这不是普通表单,我要上传文件
2、do add页面:
①设置请求的字符编码UTF-8
②解析请求之前,通过核心组件ServletFileUpload来判断是否为文件上传类型
ServletFileUpload.isMultipartContent(request),返回值是布尔
③选择上传路径,要先判断目标路径是否存在,如果不存在,自动创建
④因为最终要把上传的文件set到数据库,所以要先new 一个 news对象 。上传时间通过news.setCreate(new date())系统创建
⑥判断②中的返回值是true,就处理文件上传
⑦通过newsService调用add方法,将文件保存至数据库。成功或者失败可以选择转发和重定向
3、处理文件上传步骤:
①创建核心类ServletFileUpload,可以解析表单提交的请求,包括上传文件,包括普通文本表单里面的值
②转换请求对象,解析请求
③使用迭代器,取出请求对象FileItem,并遍历
④判断是文本域还是文件域,若是文本域,就获取文本域name的值和文本域value的值
⑤若是文件表单控制,判断文件名是否为空和空串后,就获取文件名并指定位置(全路径/文件名)上传
总结文件上传步骤
①在creat页面(提交页面):
设置三个属性:enctype;type=file;post
②在do add页面(jsp页面)
检查请求类型 :
servletFileUpload.isMultipartContent(request)返回值是布尔
声明对象:
FileItemFactory factory=new DiskFileItemFactory();
ServletFileUpload upload=new ServletFileUpload(factory);
转换请求对象,解析请求
List
items = upload.parseRequest(request);
保存上传的文件
if(!item.isFormFiled()){
File fullFile = new File (item.getName());
File UploadFile=new File(realPath,fullfile.getName());
item.write(uploadFile);
}
获取普通字段
if(item.isFormFiled()){
fieldName= item.getFieldName();//name
if(fieldname.equals(“title”)){
news.setTitle(item.getString(“utf-8”));//value
}
}
二、使用CKEditor文本编辑器对新闻进行所见即所得的编辑
CKEditor 网页中实现所见即所得的编辑器(属于js的第三方组件)
步骤:
①下载CKEditor
②解压到项目中(放入webroot下就好了)
③在页面中加入CKEditor
④使用CKEditor编辑内容(和word差不多)
⑤提交CKEditor编辑的内容
总结:
在页面中引入ckeditor.js
<script type=”text/javascript” src=”ckeditor/ckeditor.js”></script>
获取绝对路径的方法:request.getContextPath();
在页面中加入textarea,使之成为CKEditor
配置config.js配置CKEditor
补充:My97DatePicker为时间插件
三、后台实现列表分页查询(limit)
先编写分页查询sql语句,再编写分页查询方法,将分页查询分步实现
1、后台分页查询步骤:
①确定每页显示的数据数量
②计算显示数据的总数量getTotalCount();
③计算显示的页数PageSupport
总页数=总数量/每页显示的数据数量(不能整除就+1)
④编写分页查询SQL语句 (limit [m,n])
⑤实现分页查询
2、limit(m,n) m表示起始位置,n表示读n条
m =(pageNo-1)*pageSize n= pageSize
3、创建分页工具类PageSupport,放入util包中
总数量;pageSize;当前页码;总页数
总结:
①后台编写查询新闻总数量的代码 getTotalCount
②后台编写分页获取新闻列表代码 getPageNewsList
这里的sql语句要特别注意了
string sql=“select * from news_detail
limit[(pageIndex-1)*pageSize,pageSize]”;
③编写分页工具类 PageSupport
封装 总新闻数newsCount、总页数totalPageCount、
每页数pageSize,当前页号 currentPageNo
在设置set/get方法时,
要注意总页数=0也要返回当前页,
当前页数要大于0,页码要大于0,总页数也要大于0
设置总页数(判断是否要+1)
四、掌握jsp分页显示数据
分页显示关键点:
确定当前页
设置首页、上一页(当前页-1)、下一页(当前页+1)、末页的页码(控制异常)
首页与末页的控制
六、EL表达式优化页面显示
1、表达式
2、操作符“.”或 “[]”
获取对象的属性,如
访问含有特殊字符的变量,如
{news.title}
取得数组、List、Map类型对象的元素
{num1+num2}
屏蔽一些常见的异常
{news}相当于
(news)request.getAttribute(“news”)
6、EL访问的作用域
七、 JSTL标签
JSP标准标签库,实现JSP页面中的逻辑控制
1、步骤
下载jstl.jar和standard.jar包
将这2个包复制到WEB-INF\lib目录
在JSP页面中添加指令
%@talib uri=”http//java.sun.com/jsp/jstl/core” prefix=”c” %
2、
value:需要输出显示的表达式
default:默认输出显示的值(替换 空字符串和null的区别)
escapeXml:是否对输出的内容进行转义(true|false)
3、
4、
5、
6、
7、
8、
八、Servlet、过滤器和监听器
servlet介绍Server+Applet,是一种服务器端的Java应用程序。只有当一个服务器端的程序使用了ServletAPI的时候,这个服务端的程序才能称之为Servlet
MVC ( Model View Control):jsp + servlet + javabean
JSP 负责显示数据 jsp最终会被编译成一个servlet.Java
Servlet 接受请求,调用JavaBean去处理请求,给出响应
JavaBean 封装数据(entity)、业务逻辑(dao\service层)
1、主要Servlet API介绍
(1)javax.servlet.Servlet接口:
所有Java Servlet的基础接口类,规定了必须由Servlet具体类实现的方法集
(2)javax.servlet.GenericServlet类(父类)
实现servlet接口,是Servlet的通用版本,是一种与协议无关的Servlet
(3)javax.servlet.http.HttpServlet类(子类)
实现servlet接口,在GenericServlet基础上扩展的基于Http协议的Servlet 主要学习内容
2、如何创建Servlet
创建类实现javax.servlet.Servlet接口
创建类继承javax.servlet.GeneriServlet类
创建类继承javax.servlet.HttpServlet类 调用doGet/doPost方法
3、Servlet中主要方法:
init(): Servlet的初始化方法,仅执行一次
service():处理请求和生成响应(相当于派发)
destroy():在服务器停止并且程序中的Servlet对象不再使用的时候调用,只执行一次。自动调用
ServletRequest:封装客户的请求。作用相当于JSP内置对象request
ServletResponse:创建响应信息,将处理结果返回给客户端。作用相当于JSP内置对象response
ServletConfig:包含了service的初始化参数信息
4、Servlet生命周期
(1)实例化
(2)初始化(调用init方法来实现监听)
(3)处理请求(调用service方法)
(4)销毁(调用destory方法)
→浏览器发送请求
→servlet容器解析请求,创建servlet实例
→实例化后,调用init()方法初始化对象
→调用service()方法处理get/post请求,servlet输出响应信息给容器
→容器返回响应给浏览器
→servlet对象不再使用或者web服务器停止,则调用destory()方法进行销毁
5、部署运行Servlet
(1)修改web.xml(部署描述文件)
添加
添加
注;
(2)通过URL访问Servlet 注:浏览器访问url都是get请求
步骤:创建一个继承与HttpServelet的类——重写doGet或doPost()方法——在web.xml里配置
6、在servlet中使用jsp的内置对象
HttpServletRequest:getParameter 和getRequestDispatcher
HttpServletRequest:sendRedirect
HttpSession:request.getSession
7、Servlet的作用
负责接收请求,调用相应Service方法,决定如何响应,本身不做业务逻辑。
Javabean负责业务逻辑
8、service方法不需要重写
因为Servlet的service会被自动调用(就像init、destory一样),在HttpServlet中已经有了很好的实现,它会根据请求的方式,调用doGet,doPos方法,也就是说service是用来转向的。如果需要重写service方法,并且根据不同的method调用doPost、doGet等时,就要在末尾加上一句super.service(),那么servlet容器就会把请求交给这个方法来处理。
二、过滤器的使用—处理中文乱码
1、过滤器
是向web应用程序的请求和响应添加功能的web服务组件
过滤器可以统一的集中处理请求和响应
使用过滤器技术实现对请求数据的过滤
2、过滤器的使用步骤
(1)建立实现Filter接口的类(javax.servlet.Filter),实现doFilter方法
(2)实现过滤行为
//设置请求 设置响应
//调用下一个过滤器或web资源 chain.doFilter(req,res)
(3)在web.xml中配置过滤器
url可以是精确匹配、目录匹配 、扩展名匹配和全部匹配
3、过滤器的生命周期
(1)实例化
(2)初始化 init()
(3)过滤 doFilter()
(4)销毁 destory()
4、过滤器的应用场合
(1)对请求和响应进行统一处理
(2)对请求进行日志记录和审核
(3)对数据进行屏蔽和替换
(4)对数据进行加密和解密
三、监听器—统计在线人数
1、监听器:可以接收事件,并完成相关的处理
2、监听器使用步骤
(1)创建类实现HttpSessionBindingListener接口
(2)在valueBound()和valueUnbound()方法中实现用户数量的统计
(3)在web.xml中配置监听器
Session对象要配置监听器,Session对象的属性不用配置监听器
总结:
servlet派发器步骤:
(1)实例化 :继承 httpServlet 实现servlet 借口
(2)初始化 :调用init()方法(只执行一次)
(3)处理请求:调用service()方法来派发,页面上一定是get请求
(4)销毁: 调用destory()方法(只执行一次)
如何在页面上访问Servlet文件
(1)修改web.xml文件,添加
(2)通过url访问
先访问< url-pattern >,再访问
servlet-name 中的名称要一致,
路径可以是精确匹配;目录匹配/*;扩展名匹配 .xxx
如何在把java代码在页面上输出
首先在doGet请求中得有
HttpServletRequest req ,HttpServletResponse resp
然后调用PrintWriter这个类的getWriter()方法
PrintWriter out = resq.getWriter();
最后就可以out.print()了,此处的resq,out不是jsp中的内置对象