您的位置:首页 > 编程语言 > Java开发

JavaEE学习笔记之Servlet/JSP(1)

2016-07-08 00:21 471 查看
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>oneServlet</servlet-name>
<servlet-class>com.briup.day01.OneServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>oneServlet</servlet-name>
<url-pattern>/oneServlet</url-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>元素中指定了<load-on-startup> 子元素时,Servlet容器在启动web服务器时,将按照顺序创建并初始化Servlet对象
<load-on-startup>num</load-on-startup>
当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中,可以使用一个或多个<init-param>标签为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应用的初始化参数


<!-- 配置WEB应用的初始化参数 -->
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/test</param-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对象中的内容将不会被清除,内容追加
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: