Web技术-2 Java Web技术

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文件添加如下代码

<welcome-file-list>

<welcome-file>/520.jsp</welcome-file> //默认页:520.jsp

</welcome-file-list>

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注释:客户端可见    <!– 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文件,在<Connector port=”8080” protocol=”HTTP/1.1” /> 最后添加URIEncoding=”UTF-8”

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配置超时时间

<session-config> <session-timeout>1</session-timeout> </session-config> //1分钟

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配置文件,添加如下

<Resource name=”jdbc/news”

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实例,并指定它的名称和作用范围

<jsp:useBean id=”name” class=”package.class” scope=”page”/ >

b设置javabean(对象name)的属性(property)的值

<jsp:setProperty property=”newsDao” name=”service” value=”<%=newsDao>”/>

c <jsp:getProperty>  实现对javabean对象属性的获取

JSP1.2常用的基本动作标签

<jsp:include><jsp:forward><jsp:param>

<jsp:plugin><jsp:params><jsp:fallback>

JSP2.0新增的动作标签

<jsp:root><jsp:declaration><jsp:scriptlet><jsp:expression><jsp:text>

<jsp:output><jsp:attribute><jsp:body><jsp:element><jsp:dobody><jsp:invoke>

9、Include指令与动作标签

Include指令 静态包含页面,包含的是实际内容,在编译期页面才被执行

被包含页面内容发生变化,包含页面会重新编译。<%@ include file=”x.jsp” %>

动作标签:include、forward  param

Include: <jsp:include page=”url” flush=”true|false”/>动态包含页面,包含的是页面输出。先执行代码,后将页面包含。被包含页面内容发生变化,包含页面不会重新编译

forward: <jsp:forward page=”url”/>实现页面跳转 等价于服务器内部跳转

param: <jsp:param name=”参数名”value=”参数值”> 常与forward标签一起使用,为表单添加新参数或修改原有参数

<jsp:forward page=”url”>< jsp:param name=”email”value=”[email protected]”>

</jsp:forward>

五、第三方控件与分页查询

一、掌握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 <FileItem> items=null;

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

<textarea  class=”ckeditor”></textarea>

配置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、表达式

E L {username}

2、操作符“.”或 “[]”

获取对象的属性,如 n e w . t i t l e {new[“title”]}

访问含有特殊字符的变量,如 r e q u e s t [ n e w s . t i t l e ] < / p >< p > 访 n e w s L i s t [ 0 ] < / p >< p > < / p >< p > 3 < / p >< p > < / p >< p > < / p >< p > g e t < / p >< p > 4 E L < / p >< p > J S P < / p >< p > 5 E L < / p >< p > J a v a B e a n {news.title}

取得数组、List、Map类型对象的元素 l i s t [ 0 ] < / p >< p > 使 {num1+num2}

屏蔽一些常见的异常 u s e r n a m e < / p >< p > {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、<c:out/>标签

<c:out value=”” default=”” escapeXml=””>

value:需要输出显示的表达式

default:默认输出显示的值(替换 空字符串和null的区别)

escapeXml:是否对输出的内容进行转义(true|false)

3、<c:set>标签</c:set>

<c:set var=”变量名” value=“变量值” scope=“作用域”>

<c:set value=”属性值” target=“对象名” property=“对象的属性名”>

4、<c:remove/>与<c:set>对应

5、<c:forEach/>迭代标签和<c:if>条件标签

<c:forEach   var=“集合中元素名” items=“集合对象”varStatus=“循环的状态”>

<c:if test=“判断的条件” var=“判断的结果”scope=“作用域”>

{status.count}当前行号&nbsp;&nbsp; {status.index}当前元素

</c:if>

</c:forEach>

6、<c:url/>url标签 和<c:param/>参数标签

<c:url value=”url”>

<c:param name=”参数名” value=“参数值”>

</c:param>

</c:url>

7、<c:import/>导入标签

<c:import url=”导入的资源的路径”>

8、<fmt:formatDate/>格式化标签

<fmt:formatDate     value=”date” pattern=”要转换的格式”/>

八、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(部署描述文件)

添加<servlet> 把Servlet内部名映射到一个Servlet类名

添加<servlet-mapping> 把用户访问的URL映射到Servlet的内部名

注; <servlet-mapping>与<servlet>中的</servlet-name>必须一致

(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文件,添加<servlet>和<servlet-mapping>

(2)通过url访问

先访问< url-pattern >,再访问<servlet-mapping>下的<servlet-name>,再访问<servlet>下的<servlet-name>,再访问<servlet-class>,最后访问<init-param>(可以给一个value值)

servlet-name 中的名称要一致,<url-pattern>中的路径问题

路径可以是精确匹配;目录匹配/*;扩展名匹配 .xxx

如何在把java代码在页面上输出

首先在doGet请求中得有

HttpServletRequest req ,HttpServletResponse resp

然后调用PrintWriter这个类的getWriter()方法

PrintWriter  out = resq.getWriter();

最后就可以out.print()了,此处的resq,out不是jsp中的内置对象

猜你喜欢

转载自blog.csdn.net/w252064/article/details/79926646
今日推荐