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):公共网关接口(进程)
特点:
Servlet:API在J2EE,SUN公司运营管理(线程)
特点:
接下来明白下 Servlet 中的一些概念:
Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤:
按照一种约定俗成的称呼习惯,通常我们也把实现了servlet接口的java程序,称之为Servlet
Servlet类编写
1) 类 间接或者直接实现Servlet接口
三种方式:
2) 在web.xml进行 配置
3) 访问
Servlet生命周期以及工作原理
配置初始化参数
ServletContext对象
HttpServletRequest & HttpServletResponse
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。request和response对象即代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向客户机输出数据,只需要找response对象就行了。
1) HttpServletResponse
2) HttpServletRequest
getHeader(string name)
getHeaders(String name)
getHeaderNames()
我们知道服务器端开发(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对象中的内容将不会被清除,内容追加
相关文章推荐
- Java面向对象小项目 慕课网Java入门第二季答答租车系统
- Java 利用 ICC 色彩空间 color space profile 实现 RGB 和 CMYK 颜色的相互转换
- 基于java过滤器实现web系统的IP访问控制
- IDEA 2016在创建spring项目时遇到的坑
- Java创建文件且写入内容的方法
- Spring框架(jsonp调用乱码问题)
- java后台框架源码 springmvc mybatis
- spring事务的隔离级别和传播方式
- javaCV 配置
- java----IO流
- java基础/集合框架/set/hasset/linkHasset/TreeSet/
- Java输入输出流 结构详解
- eclipse自动补全
- 分布式任务调度——quartz + spring + 数据库
- Java 8 Lambda表达式
- 深度优先和广度优先遍历及其 Java 实现
- 关于使用Intellij Idea创建SpringMVC框架时,Jsp里的EL表达式不能被解析的问题
- Java基础——数据类型
- Java基础——变量
- Java基础——基本数据类型的包装类