servlet

1、什么是servlet?能做什么?
sun公司制定的一种用于扩展web服务器功能的组件规范。
扩展:
web服务器本身没有计算能力,也就是说,不能处理动态资源的请求。servlet可以处理动态资源的请求。
组件规范:
组件是符合规范,完成一定功能,并可以单独部署的软件模块
组件一般不能独立运行,需要依赖容器才能运行。
容器:
是一种程序,提供组件的运行环境,并且管理组件的生命周期。
servlet容器:
提供servlet运行的环境,并且管理servlet的生命周期。一般常见的web服务器,比如tomcat、weblogic、WebSphere、IIS,除了是一个servlet容器以外,也是一个web服务器。
能做什么?
servlet只能够采用java语言来开发,servlet可以做java类能做的所有的事情。
2、如何开发一个servlet
step1 写一个java类,实现servlet接口或者继承HttpServlet类
step2 编译 (javac,依赖servlet api)
step3 打包 (定义一个特定的目录结构,将相应的字节码,配置文件,相关的jar文件放到对应的目录结构里)
appname(名称任意,一般称换为应用名)
WEB-INF(必须这样写,大小写也要一样)
classes(必有,放字节码文件.class文件)
lib(可选,放.jar文件)
web.xml(必有,部署描述文件)
html/jsp
step4 部署(将step3中的结果放到服务器特定的目录,对于tomcat,是webapps)
step5 启动服务器
startup.bat windows
startup.sh linux
启动成功:http:/localhost:8088
关闭服务器:shutdown.bat / shutdown.sh
step6 访问servlet
http://localhost:8088/appname/url-pattern
3、servlet是如何运行的?
加入在浏览器地址栏输入了如下地址:
http://ip:port/helloworld/hello
1)浏览器依据ip,port连接服务器。
2)浏览器将请求数据按http协议打成一个http请求数据包(包含了helloworld/hello)
3)服务器当中的一个负责通讯的模块(一般称为servlet引擎)创建HttpServletRequest的一个实例(HttpServletRequest实际上是一个接口,由服务器提供者来实现),该实例包含了请求数据包中的数据。另外,还创建了一个HttpServletResponse的一个实例(也是一个接口)。
4)服务器依据helloworld/hello找到web.xml,依据web.xml中的信息找到对应的servlet类名。会查看该servlet有没有对应的实例,有的话,就不创建,使用现成的实例。接下来,调用service()方法。service方法里面的代码可以通过HttpServletRequest提供的方法来获得请求中的数据,并且,也可以将处理之后的结果通过HttpServletResponse提供的方法设置返回的结果。
5)Servlet引擎从HttpServletResponse获取数据,生成http响应包,发给浏览器。
4、使用myeclipse开发servlet
1)安装myeclipse
2)开发步骤
step1 建立一个web工程
step2 在src下面编写java类
step3 在web.xml中配置servlet
step4 部署
a,让myeclipse管理tomcat
b,部署
step5 访问
http://ip:port/appname/url-pattern

5、get/post请求方式
(1)get方式:
a,表单默认提交的方式
b,直接在浏览器地址栏输入地址
c,通过连接访问某个地址
(2)get方式的特点
在地址栏会显示请求数据
请求数据会放到请求资源路径后面
get方式一般用于向服务器获取资源
浏览器有可能缓存get方式访问过的数据
(3)post方式
设置表单method="post"
(4)post方式的特点:
a,数据不会在地址栏显示
b,数据会存放到实体内容里
c,post方式一般用于向服务器提交大量数据
(5)优缺点比较
get方式提交数据有两个缺点:
a,提交的数据量有限制(因为只能存放到请求行之后)
b,不安全(在浏览器地址栏能看到数据)
post方式提交数据得有点:
a,数据量大(因为存放在实体内容里面)
b,相对安全(但是实体内容里面的数据仍然没有加密,可以借助工具看到)
6、重定向
1)什么是重定向
服务器向浏览器发送一个状态码302及一个消息头location,浏览器会立即向location所指定的地址发送一个新的请求
2)编程
response.sendRedirect(从定向的地址);
3)重定向的特点及需要注意的问题
a)重定向的地址是任意的
b)浏览器地址栏的地址会变成重定向的地址
c)一个事情已经做完
要注意的问题:
在重定向之前,不能够有任何的输入输出,如果缓存当中有数据,重定向之前,会先清空缓存中的数据。
7、服务器如何处理url地址
比如在浏览器地址栏输入:
http://ip:port/appname/abc.html
浏览器会依据ip、port连接服务器,然后,会将/appname/abc.html存放到请求数据包的请求行。
服务器如何处理“/appname/abc.html”
step1 服务器会查看有没有appname对应的应用存在,若没有,则返回404.若有,则进行下一步。
step2 在web.xml中,使用"/abc.html"与url-pattern进行匹配:
a,精确匹配:要求完全匹配
b,模糊匹配(使用通配符*) *代表任意的字符串
比如:
/some/*
/some ok!
/some/adsfw ok!
c,后缀匹配
不能以“/”开头
比如:
*.do 表示已.do结尾的请求
step3 如果任然不匹配,会查询静态资源。如果能够找到该资源,则返回,找不到,返回404
8、servlet的生命周期与核心的类与接口
(1)核心类与接口
Servlet接口
a,所有的Servlet,必须实现该接口
b,该接口定义了三个方法
init(ServletConfig config):初始化方法
service(ServletRequest request,ServletResponse response):处理请求
destroy():销毁资源
GenericServlet抽象类,部分实现了servlet接口。
实现了init,destroy方法
HttpServlet抽象类,继承GenericServlet,实现了service()方法
service(HttpServletRequest request,HttpServletResponse response)。
HttpServletRequest是ServletRequest的子接口
HttpServletResponse是ServletResponse的子接口
(2)生命周期:
什么是生命周期:servlet容器如何去创建servlet实例,分配资源,调用其他方法,最后销毁的整个过程。
分四个阶段:
a,实例化:调用缺省的构造器,创建对象。创建对象的时机:
1)当请求到达服务器时,如果要访问的servlet没有对应的实例,则会创建。
2)当服务器启动时,会检查web.xml中的配置,如果<load-on-startup>1</load-on-startup> "1"表示优先级,值越小,优先级越高
b,初始化:分配资源
servlet容器创建servlet实例之后,一定会执行init()方法。
默认的init()有GenericServlet来实现。如果想定义自己的初始化过程,可以override init()方法。
方法一:override init(ServletConfig config)
方法二:override init()。最好使用方式二
c,就绪,执行service()方法。
HttpServlet的service()方法,会依据get/post请求,分别调用对应的doGet(HttpServletRequest request,HttpServletResponse response)
doPost(HttpServletRequest request,HttpServletResponse response)方法。
我们开发servlet,可以用override service()或者override doGet(),doPost()
d,销毁:容器依据自己的算法,会删除servlet实例,在删除之前,会调用destroy()方法,释放资源,只执行一次。
9、servletConfig接口:
容器在调用init()方法时,会事先创建好该对象,以参数的形式传递给servlet对象
该接口定义了获取servlet配置参数的方法
String getInitParameter(String name)
10、表单处理
(1)获取表单中的数据
参数名不存在,返回null
String getParameter(String paranName)
如果有多个参数名相同,则使用下面的方法:
String[] getParamenterValues(String paraname) ?city=bj&city=sh&city=wh
返回键值对,每一个键值对对应一个参数名和参数值
参数值是一个String[]。
Map getParameterMap();
(2)中文问题
浏览器对表单中的数据(非ASCII字符)进行编码。所使用的编码是打开该表单所在的页面时所使用的编码。
step1 静态页面(html),使用:
<meta http-equiv="content-type" content="text/html;charset=uft-8"/>
指定打开页面时的编码
step2 在servlet当中
a,request.setCharacterEncoding("utf-8")//指定request对象解码时所使用的编码格式
b,如果要输出数据到浏览器,还要使用response.setContentType("text/html;charset=utf-8")
step3 如果要保存数据到数据库
a,创建数据库时,使用
create database DatabaseName default
charset set utf8 (注:此处就是没“-”,不是utf-8)
b,jdbc驱动程序,指定数据库编码,即告诉驱动程序,当前数据库保存数据所使用的编码是什么
jdbc:mysql://localhost:3306/DatabaseName?useUnicode=true&characterEncoding=utf8

11、web.xml的加载顺序是:context-param、listener、filter、servlet

12、servlet load-on-startup配置相关:是否在启动的时候就加载这个servlet,当值为0或者大于0,表示容器在应用启动的时候就加载这个servlet,当是一个负数或者没有指定时,则指示容器在该servlet被选择时才加载,正数值越小,启动该servlet的优先级越高。

转载于:https://www.cnblogs.com/npng09/p/10809203.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值