摘要:1.常见软件架构. C/S: 客户端 服务器 安全性较好,但是升级需要升级两端 B/S: 浏览器 服务器 安全性较差, 但是升级时 只需要升级服务器端(我们今后就是开发这个架构的) 2.资源分类: 静态资源: 无论访问多少次 内容都不会发生变化. html .css .js . 动态资源: 访问结果会发生变化. servlet,jsp . jsp就是servlet. php
1.常见软件架构.
C/S: 客户端 服务器 安全性较好,但是升级需要升级两端
B/S: 浏览器 服务器 安全性较差, 但是升级时 只需要升级服务器端(我们今后就是开发这个架构的)
2.资源分类:
静态资源: 无论访问多少次 内容都不会发生变化. html .css .js .
动态资源: 访问结果会发生变化. servlet,jsp . jsp就是servlet. php,asp.
3.常见服务器: tomcat
4.tomcat 会以下配置:
1.修改tomcat端口号
2.会配置虚拟目录
3.会配置虚拟主机(了解)
5.HTTP协议
就是规范了 浏览器和服务器之间通信的规范(格式)
请求
请求首行
请求头
请求空行
请求正文(只有post提交时正文才有内容)
响应
响应首行
响应头
响应空行
响应正文
常见状态码:
HTTP/1.1 200 OK
200: 成功
404: 访问的资源未找到
500: 服务器内部错误(通常是开发人员的错)
302: 重定向(两次请求)
304: 缓存机制.
---------------------------------------------------------------------------------------------------------------------------------------
servlet ==> server applet
两个动态资源之一(servlet,jsp).
是javaweb中 servlet技术中三大组件之一.
*servlet
*filter
*listener
如何来写一个servlet呢?
找到servlet接口 去实现,那么你这个类就是servlet.
实现servlet的方式:
*实现servlet接口
*继承GenericServlet
*继承HTTServlet
servlet中的生命周期方法:
1.init方法: servlet被创建之后会调用该方法. 但是在服务器运行期间,一个servlet 只存在一个实例.所以通常来讲,init方法只被调用一次(第一次访问时).
作用: 可以在init方法中做一些资源初始化动作.例如: 建立数据库连接.....
2.service方法: servlet真正处理请求,并返回响应的方法. 其中提供两个对象,servletRequest(封装了请求信息,明天讲) ,servletResponse(使用他可以添加响应信息,明天讲)
3.destory方法: 是在服务器关闭,要销毁servlet之前,会调用该方法. 如果servlet中有一些资源需要释放.那么在destory中操作.
以上3个方法就是servlet的生命周期方法.
servlet中的另外两个方法:
4.getServletInfo : 没用的方法,当它不存在
5.getServletConfig方法: 获得servletConfig对象
ServletConfig对象是干嘛的?
<servlet>
<servlet-name>CServlet</servlet-name>
<servlet-class>cn.itcast.servlet.generic.CServlet</servlet-class>
<init-param>
<param-name>userName</param-name>
<param-value>tom</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>1234</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>CServlet</servlet-name>
<url-pattern>/CServlet</url-pattern>
</servlet-mapping>
4个方法:
getServletName ==> 返回web.xml中配置的servlet-name
getInitParameter(key); ==> 根据key获得 init-param中配置的值
getInitParameterNames() ==> 返回一个类似于迭代器的枚举,返回配置文件中所有init-param的key
getServletContext ==> 返回一个servletContext对象,这个对象下午讲.
//优化 ==> GennericServlet中的优化
以前获得ServletName需要这么调用 ==> this.getServletConfig().getServletName()==>优化后 我想这么调 ==> this.getServletName();
==>让我们的servlet当中含有该方法就可以==> 可以自己在servlet中去定义getServletName()方法,但是麻烦 ==> 直接让我们的servlet实现servletConfig接口
==>config接口中的4个方法都有了.==> 怎么实现?直接使用init方法中传递过来的servletConfig的实现类来实现就可以 ==> init方法中我们要接受传过来的servletConfig的实现类
==> 别人继承我们GenericServlet的时候 不能再重写init方法了. 我们就自己定一个空参的init方法.==> 别人如果想要初始化的动作,重写我们给他准备的无参init方法即可.
//===================================================================================================================================================
复习如何开发一个servlet
1.创建一个类,实现servlet接口
2.手动编译这个类,将这个类放到WEB-INF/classes目录下.(现在MyEclipse帮我们做了)
3.在web.xml中配置这个servlet,如下:
<servlet>
<servlet-name>AServlet</servlet-name>
<servlet-class>cn.itcast.servlet.AServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AServlet</servlet-name>
<url-pattern>/AServlet</url-pattern>
</servlet-mapping>
4.把这个web项目部署到服务器(tomcat)上去.
servlet在服务器中的运行流程(自己看图)
//===============================================================================================================================================
HTTPServlet
1.帮我们把reqeust对象和response对象 进行强转. ==> HTTPServletRequest HTTPServletResponse
2.根据请求方式不同调用不同的方法例如 POST ==> doPost 方法 GET ==> doGet方法
以后我们开发 全都继承HTTPServlet就可以.
//-----------------------------------------------------------------------------------------------------------------------------------------------
Servlet中的一些细节
1.关于Servlet的线程安全问题
因为一个servlet的实例在服务器中只存在一份. ==> 当有多个请求访问时,servlet线程将不安全.
如何规避线程安全问题呢? ===> 我们接受线程的信息时,将信息保存在方法的变量中,不要使用成员变量保存.
2.关于servlet中路径配置问题
<!--
路径配置分为两种情况
路径匹配
/DServlet ==> http://localhost:8080/Day10/DServlet
/ABC/DServlet ==> http://localhost:8080/Day10/ABC/DServlet
/ABC/BCD/DServlet ==> http://localhost:8080/Day10/ABC/BCD/DServlet
/ABC/* ==> http://localhost:8080/Day10/ABC/asdlkajsdlkjalsd
/ ==> 匹配所有路径 http://localhost:8080/Day10/2139009123j/asd2klnasd
匹配优先级: 路径匹配中 ,匹配的范围越广,优先级越低.
后缀名匹配
*.do ==> http://localhost:8080/Day10/213oiajsdoijoad.do
*.action ==> http://localhost:8080/Day10/lnasdljasdlkasljdasd.action
*.abc ==> http://localhost:8080/Day10/1039i09ixc0kasd.abc
这种路径匹配在现在学习阶段接触不到. 在学到Filter 和struts2 的时候就用到了.
!!!!!!!注意: 以上两种匹配方式不能同时使用
例如下面是绝对错误的:
/DServlet/*.do ==> 凡事路径配置中以"/"开头那么就说明含有路径匹配.这种时候再使用*.do 这种后缀名匹配绝对报错.
-->
3.(拓展)关于tomcat中web.xml的信息
1> defaultServlet 配置的路径是 "/" ==> 所有跟我的路径匹配不上的路径都会走default.default主要干两件事 1.找静态资源 2.找不到静态资源报错.
2>session相关的配置 ==> 30 ==> 学session的时候就知道了
3>将所有MIME类型 都列举出来了.
4>welcome list file ==> 默认的欢迎资源.
4.我们知道servlet默认创建实例的时机是什么时候? ==> 第一次请求该servlet时创建. ==> 如果我们这个servlet创建需要的时间比较久.我们想让servlet随着服务器的启动而启动
那么我们可以这样做:
<servlet>
<servlet-name>AServlet</servlet-name>
<servlet-class>cn.itcast.servlet.AServlet</servlet-class>
<!-- 在启动服务器时加载的意思
配置了该配置,那么这个servlet就会在服务器启动时创建实例.
这个配置中填写的内容是整数 最小可以填0.
数字越小 启动优先级越高. 所以0 表示优先级最高.
如果两个数字大小相同,优先级按照配置顺序,谁先配置 谁先创建.
-->
<load-on-startup></load-on-startup>
</servlet>
//------------------------------------------------------------------------------------------------------------------------------------------------------------
ServletContext对象
介绍
1.这个对象代表着咱们的整个项目.==> 这个对象在一个项目中只存在一个实例.
2.启动项目的时候会自动创建. 关闭服务器的时候会销毁该实例.
3.该对象如何获取呢? ==> servletConfig 中 有一个方法叫做 getServletContext方法 来获得.
功能
一:可以获得项目中的一些配置(web.xml)
getInitParameter(String name) 根据键获得值
getInitParameterNames() 获得所有键
上面这两个方法名字与servletConfig中的一模一样.但是获得的配置信息是
<context-param>
<param-name>userName</param-name>
<param-value>tom</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>1234</param-value>
</context-param>
二:作为我们servlet技术中 三大域对象之一. 如果包含jsp的话,其实有4大域 page域.
application ==> servletContext
session
request
域对象涉及到4个方法
getAttribute(key) 根据键获得值
setAttribute(key,value) 往application域中的map 存放一个键值对
removeAttribute(key) 从application域中的map 删除一个键值对
getAttributeNames(); 从application域中的map 获得所有的键
三:可以获取项目中的资源.(例如获得项目中存放学生的stu.xml)
//想对WEB-INF/Demo.xml进行操作.我们要先读取出该文件
//如何来读取呢?
//File file = new File("E:/代码/Workspaces0808/Day10-servlet/WebRoot/WEB-INF/demo.xml");
//上面获得demo.xml填写的路径显然是不对的.获得的是工程下的而我们要获得最终部署到服务器上的.
//File file = new File("E:/apache-tomcat-6.0.35/webapps/Day10-servlet/WEB-INF/demo.xml");
//上面这种获得方式就对了.但是 如果把项目再部署到其他地方,那上面这个写死的路径就无效了.
//这样类似获得外部资源的例子很多,所以servletContext对象给出了解决办法.
//getRealPath("/") ==> 获得绝对路径 ,根据参数中的相对路径获得. "/"相对于WebRoot
//getResourceAsStream("/"); ==>直接获得 想要找的资源的流 . 参数还是填相对路径,同上
例子:
String path = getServletContext().getRealPath("/WEB-INF/demo.xml");
System.out.println(path);
InputStream is = getServletContext().getResourceAsStream("/WEB-INF/demo.xml");
System.out.println(is);
//---------------------------------------------------------------------------------------------------------------------------------------
使用Class和ClassLoader 获得项目中的资源路径
//web-inf下的
String path1 = getServletContext().getRealPath("/WEB-INF/demo.xml");
//lib下的
String path2 = getServletContext().getRealPath("/WEB-INF/lib/demo.xml");
//src下的
String path3 = getServletContext().getRealPath("/WEB-INF/classes/demo.xml");
//cn.itcast.servlet.servlet_context包下的
String path4 = getServletContext().getRealPath("/WEB-INF/classes/cn/itcast/servlet/servlet_context/demo.xml");
//其实上面例子中path3 和 path4 这两种方式 有些麻烦
//在介绍一种获得资源的方式,是对.class ==> Class 和 classLoader的应用
InputStream is = this.getClass().getResourceAsStream("demo.xml"); // 如果不加"/"==> 相对的是类的当前(包)目录
InputStream is2 = this.getClass().getResourceAsStream("/demo.xml");//如果加了"/" ==> "/"就代表classes目录(src)
//在说下classLoader 下也有方法 classLoader 就是类的加载器. ==> 专门来读取class文件的输入流
//也提供了读取其他文件的方法.(使用classLoader不要读取较大的文件)
// this.getClass().getClassLoader() ==> 获得类的加载器
InputStream is3 = this.getClass().getClassLoader().getResourceAsStream("/demo.xml");// 不论加不加"/",都相对于 classes目录,跟class中加"/" 的相对路径是一样的.
//使用class或classLoader 也可以获得文件的绝对路径
URL url = this.getClass().getResource("demo.xml");
System.out.println(url.getPath());
作业:
写一个servlet, 实现访问次数统计的功能.
例如:第一次访问这个servlet时, 给用户显示您是第一访问
第2次访问时显示 您是第2次访问 ........以此类推.
其他servlet也要参与统计.(servletContext 中 域的应用)
相关文章推荐
虚拟主机的专业参数,分别都是什么意思?2022-09-09
中非域名注册规则是怎样的?注册域名有什么用处? 2022-01-10
HostEase新年活动促销 美国/香港主机全场低至五折2021-12-28
HostGator下载完整备份教程分享2021-12-28
Flink中有界数据与无界数据的示例分析2021-12-28