Servlet 以前也叫 server applet
我们知道服务器端开发(Servlet,JSP)即Web开发:
html/css :制作静态页面
servlet:动态界面(Servlet是sun公司提供的一门用于开发动态web资源的技术)
静态页面和动态页面的区别:看界面与服务器之前有没有数据的交互
Web开发里面的模式(主流的企业级开发模式):
C/S:客户端与服务器
优点:①安全性性高 ②客户端是可以分担服务器的一些功能模块的
缺点:①必须安装客户端 ②开发成本大 ③维护比较困难 ④不能无缝升级
B/S:浏览器与服务器
优点:①只要开发服务器端就可以了 ②可以实现无缝升级
缺点:①安全性低 ②所有的功能的都是由服务器端去完成的(高强度的负载)
现在讲的Servlet 就是基于 B/S 模式的。
首先来比较下 CGI 和 Servlet
CGI(Common Gateway Interface):公共网关接口(进程)
特点:
CGI每次都会启动一个进程来处理客户端发来的请求,效率比较低。
CGI遵循HTTP协议
CGI支持多语言开发
Servlet:API在J2EE,SUN公司运营管理(线程)
特点:
Servlet每次都会启动一个轻量级的线程来处理客户端发来的请求,效率比较高
Servlet 采用单例的。
接下来明白下 Servlet 中的一些概念:
简单的概念:Servlet就是运行在服务器端的JAVA代码。有自己的一套API
专业的概念:Servlet是一个组件(用很少的代码去完成一个功能)
服务器:就是一台主机,安装一些软件
Tomcat:服务器的容器
bin:可执行文件
webapps:所有部署到服务器上的代码全都在这个文件夹里面
Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤:
1) 编写一个Java类,直接或间接实现servlet接口。
2) 把开发好的Java类部署到web服务器中。
按照一种约定俗成的称呼习惯,通常我们也把实现了servlet接口的java程序,称之为Servlet
Servlet类编写
1) 类 间接或者直接实现Servlet接口
三种方式:
1.实现Servlet接口
2.继承GenericServlet抽象类
3.继承HttpServlet抽象类
2) 在web.xml进行 配置
<servlet>
<servlet-name>oneServletservlet-name>
<servlet-class>com.briup.day01.OneServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>oneServletservlet-name>
<url-pattern>/oneServleturl-pattern>
servlet-mapping>
3) 访问
http://localhost:8888/week2/oneServlet
http://localhost:8888 代表 服务器根目录 即tomcat_home/webapps
week2 代表项目名
/oneServlet 代表 servlet 的 url
Servlet生命周期以及工作原理
1)生命周期
1)初始化阶段 调用init()方法(调用一次)
2)响应客户请求阶段 调用service()方法(只要收到请求就会调用)
3)销毁阶段 调用destroy()方法(调用一次)
Servlet何时被创建:
1,默认情况下,当WEB客户第一次请求访问某个Servlet的时候,WEB容器将创建这个Servlet的实例。
2,当web.xml文件中如果元素中指定了 子元素时,Servlet容器在启动web服务器时,将按照顺序创建并初始化Servlet对象
num
当num值为0或者大于0时,表示容器在应用启动时就加载这个servlet。
当num值小于0或者没有指定时,则指示容器在该servlet被选择时才加载。
正数的值越小,启动该servlet的优先级越高。
2)工作原理
Servlet依赖于ServletRequest和ServletResponse接口,这两个接口负责为Servlet接受和发送信息。 HttpServlet也类似。
当某个Servlet第一次被请求时,服务器(Servlet容器)会生成该Servlet并调用它的init()方法, 再调用其service()方法处理请求【通过源代码可见,service()方法中对请求的方式进行了匹配,选择调用doGet,doPost等这些方法,然后再进入对应的方法中调用逻辑层的方法,实现对客户的响应】处理结束后该Servlet会常驻于容器中,下一个请求则不再 重新生成Servlet,而是直接调用常驻的Servlet对象的service()方法。服务器停止时,会调用该Servlet的destroy()方法。因此,在Servlet的一个生命周期中,init()和destroy()仅会被调用一次, 而service()则会被调用多次。
配置初始化参数
在Servlet的配置文件web.xml中,可以使用一个或多个标签为servlet配置一些初始化参数。
配置:
<servlet>
<servlet-name>basic</servlet-name>
<servlet-class>com.briup.prep.day01.BasicServlet</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>licy</param-value>
</init-param>
//改变servlet初始化时机(在启动项目的时候初始化)
<load-on-startup>1</load-on-startup>
</servlet>
获取:
String password = getServletConfig().getInitParameter("username");
ServletContext对象
WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过config.getServletContext()方法获得ServletContext对象。
1) 多个Servlet通过ServletContext对象实现数据共享
ServletContext context = this.getServletConfig().getServletContext();//获得ServletContext对象
context.setAttribute("data", data); //将data存储到ServletContext对象中
2) 获取WEB应用的初始化参数
<context-param>
<param-name>urlparam-name>
<param-value>jdbc:mysql://localhost:3306/testparam-value>
context-param>
3) 用servletContext实现请求转发
context.getRequestDispatcher("/login.jsp").forward(request, response);
4) 使用servletContext读取资源文件
InputStream is = context.getResourceAsStream("/WEB-INF/init/db.properties");
System.out.println(is);
Properties prop = new Properties();
prop.load(is);
String name = (String) prop.getProperty("name");
String gender = prop.getProperty("gender");
HttpServletRequest & HttpServletResponse
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。request和response对象即代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向客户机输出数据,只需要找response对象就行了。
1) HttpServletResponse
1.向客户端(浏览器)发送数据的相关方法
getOutputStream()
getWriter()
2.向客户端(浏览器)发送响应头的相关方法
addDateHeader()
addHeader()
addIntHeader()
containsHeader()
setDateHeader()
setHeader()
setIntHeader()
例如:
response.setHeader("content-type", "text/html;charset=UTF-8");
3.向客户端(浏览器)发送响应状态码的相关方法
setStatus()
下载实例:
private void downloadFileByOutputStream(HttpServletResponse response)
throws FileNotFoundException, IOException {
//1.获取要下载的文件的绝对路径
String realPath = this.getServletContext().getRealPath("/download/1.JPG");
//2.获取要下载的文件名
String fileName = realPath.substring(realPath.lastIndexOf("\\")+1);
//3.设置content-disposition响应头控制浏览器以下载的形式打开文件
response.setHeader("content-disposition", "attachment;filename="+fileName);
//4.获取要下载的文件输入流
InputStream in = new FileInputStream(realPath);
int len = 0;
//5.创建数据缓冲区
byte[] buffer = new byte[1024];
//6.通过response对象获取OutputStream流
OutputStream out = response.getOutputStream();
//7.将FileInputStream流写入到buffer缓冲区
while ((len = in.read(buffer)) > 0) {
//8.使用OutputStream将缓冲区的数据输出到客户端浏览器
out.write(buffer,0,len);
}
in.close();
}
2) HttpServletRequest
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。
1.作为容器
setAttribute(String name,Object o) 将数据作为request对象的一个属性存放到request对象中
getAttribute(String name) 获取request对象的name属性的属性值
removeAttribute(String name)移除request对象的name属性
getAttributeNames() 获取request对象的所有属性名
2.获得客户机信息
getRequestURL() 返回客户端发出请求时的完整URL。
getRequestURI() 返回请求行中的资源名部分。
getRemoteAddr() 返回发出请求的客户机的IP地址。
getRemoteHost() 返回发出请求的客户机的完整主机名。
getRemotePort() 返回客户机所使用的网络端口号。
getLocalAddr() 返回WEB服务器的IP地址。
getLocalName() 返回WEB服务器的主机名。
getQueryString()返回请求行中的参数部分。
getPathInfo() 返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头。
3.获得客户机请求头
getHeader(string name)
getHeaders(String name)
getHeaderNames()
4.获得客户机请求参数(客户端提交的数据)
getParameter(String) 方法(常用)
getParameterValues(String name)方法(常用)
getParameterNames() 方法(不常用)
getParameterMap() 方法(编写框架时常用)
5.Request对象实现请求转发
request.getRequestDispatcher("/test.jsp").forward(request, response);
request.getRequestDispatcher("/test.jsp").include(request, response);
调用forward()方法后,原先存放在HttpResponse对象中的内容将会自动被清除
调用include()方法后,原先存放在HttpResponse对象中的内容将不会被清除,内容追加