Servlet和JSP读书笔记(一)
Java Servlet 技术,简称Servlet,是Java中用于开发web应用程序的基本技术。
Servlet实际上也就是一个Java程序。一个Servlet应用程序通常包含很多Servlet。而我们熟知的JSP页面最终也是要被编译为Servlet。
Servlet应用程序是不能像一个普通类直接运行的,它必须运行在Servlet容器中。
Servlet容器的作用就是将一个客户端的请求传给Servlet,并将Servlet应用程序的响应回传给客户端。
一. Servlet API 概述
Servlet API 中有4个Java包:
javax.servlet.*; javax.servlet.http.*; javax.servlet.annotation.*; javax.servlet.descriptor.*;
二. 关于第一个包 javax.servlet.* 的主要类型(没有全部列出)
public interface javax.servlet.Servlet public interface javax.servlet.ServletRequest public interface javax.servlet.ServletResponse public interface javax.servlet.ServletContext public interface javax.servlet.ServletConfig public interface javax.servlet.RequestDispatcher public interface javax.servlet.Filter public abstract class GenericServlet extends java.lang.Object implements Servlet, ServletConfig, java.io.Serializable
三 . public interface javax.servlet.Servlet 接口
1.该接口中声明的方法如下:
public void init(ServletConfig config) throws ServletException
public void service(ServletRequest req, ServletResponse res) throws ServletException,java.io.IOException
public ServletConfig getServletConfig() public java.lang.String getServletInfo() public void destroy()
2. Servlet技术的核心就是这个Servlet接口。这是所有Servlet类都必须直接或者间接实现的一个类。(直接实现就是一个Servlet类直接implements Servlet,间接实现
就是继承一个实现了Servlet的类)。
Servelt接口定义了Servlet应用程序和Servlet之间的规则。这个规则就是:Servlet容器负责把Servlet类加载到内存中,并在Servlet实例中调用特定的方法(特别注
意:在一个Servlet应用程序中,每个Servlet只有一个实例。)。客户端用户的请求会触发Servlet容器调用一个Servelt实例的service 方法,并传递给这个方法一个
ServletRequest实例和一个ServletResponse实例。ServletRequest实例封装当前HTTP请求,它的作用是便于开发者解析和操作原始的HTTP数据;ServletResponse封装当前
用户的HTTP响应,它的作用是可以将响应回传给客户端。Servlet容器还为每个应用程序创建一个ServeltContext实例,其主要作用就是封装了应用程序(Context)的环境细节。
每一个应用程序(Context)只有一个ServletContext实例。同时,Servlet容器还为每个应用程序创建一个ServeltConfig实例,它的主要作用就是封装一些Servlet的配置信息。
关于ServletContext和ServletConfig后面会给出详细的解说。
3. public void init(ServletConfig config) throws ServletException
第一次请求Servlet时,Servlet容器就会调用这个方法且只调用一次。
可在此方法中编写一些于应用程序相关的初始化代码。
Servlet容器会向该方法传递一个ServletConfig实例,一般会在init方法中将这个实例对象赋值给一个ServletCofig类型的成员变量。便于其他方法使用。
4. public void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException
每次请求Servelt时都会调用这个方法。
在此方法中编写实现程序功能和逻辑的代码。
5. public void destroy()
卸载应用程序或者关闭应用程序时会调用destory()方法。
在此方法中编写与资源清理相关的代码。
6. public ServletConfig getServletConfig()
返回Servlet容器传给init方法的ServletConfig。
为了让这个方法不返回null,你需要将Servlet容器传给init方法的ServletConfig对象赋值给一个类成员变量。
7. public java.lang.String getServletInfo()
返回任意有用的一个字符串或者null。
8.在演示实例之前必须知道我们在浏览器中输入的url和我们编写的servlet如何才能对应起来,换句话说就是在浏览器中输入怎样的url就可以调用相应的servlet
类。servlet中实现此功能有两个技术:web.xml 和 @WebServlet注解。
①web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app> <servlet>
<!-- <servlet-name>由你自己定,但是必须和 <servlet-mapping>中的<servlet-name>一致 -->
<servlet-name> servletName </servlet-name> <!-- <servlet-class> 为你想要调用的servlet的全类名 -->
<servlet-class> fullClassName </servlet-class> <!-- 传给servlet 的初始化参数,可以有多个 init-param 初始化参数这部分可以先忽略不看 直接看 <servlet-mapping> -->
<init-param>
<!-- 参数名 -->
<param-name> name </param-name>
<!-- 参数值 -->
<param-value> value </param-value>
</init-param> <init-param>
<param-name>name</param-name>
<param-value>admin</param-value>
</init-param> </servlet> <servlet-mapping> <servlet-name> servletName </servlet-name> <!-- 上面 <servlet-class> 类所匹配到浏览器输入的url -->
<url-pattern>/url</url-pattern> </servlet-mapping> </web-app>
② @WebServlet注解方式
/* name 对应 web.xml的 <servlet-name>servletName</servlet-name>
urlPatterns 对应 web.xml的 <url-pattern>/url</servlet-name>
initParams={@WebInitParam(name="name",value="value")} 对应web.xml的 <init-param>
<param-name> name </param-name>
<param-value> value </param-value>
</init-param>
*/
@WebServlet(name="servletName",urlPatterns="/url",
initParams={
@WebInitParam(name="name",value="value"),
@WebInitParam(name="name1",value="value1")
})
public class MyFirstServlet implements Servlet {
// .......
}
③ 任意选择上面的一种去配置。例如,采用注解方式配置如下:
@WebServlet(name="myFirstServlet",urlPatterns="/my",
})
public class MyFirstServlet implements Servlet {
//......
}
则浏览器输入 http://localhost:8080/项目名称/my 就可执行MyFirstServlet 这个servlet类,并调用init()方法和service()方法。
9. 关于前面知识的一个Servlet应用程序小实例。
package com.hjj.servlet.one; import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet; /*
采用@WebServlet注解的方式配置该servlet访问路径,此时就不需要在web.xml文件中进行配置
配置访问路径的属性就是urlPatterns */
@WebServlet(name="MyFirstServlet",urlPatterns="/myFirstServlet")
public class MyFirstServlet implements Servlet { private ServletConfig servletConfig = null;
@Override
public void destroy() {
System.out.println("我是Detstroy方法,我被调用了 ^_^");
System.out.println("-----------------------servlet结束-------------------------"); } @Override
public ServletConfig getServletConfig() {
return this.servletConfig;
} @Override
public String getServletInfo() { return "myFirstServlet";
} @Override
public void init(ServletConfig arg0) throws ServletException {
System.out.println("----------------------servlet开始--------------------------");
this.servletConfig = arg0; //
System.out.println("我是init方法,我被调用了 ^_^"); } @Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { System.out.println("我是service方法,我被调用了 ^_^");
String servletName = this.servletConfig.getServletName();
System.out.println("servletName = "+servletName); response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
PrintWriter pw = response.getWriter();
pw.print("<html><head><head><title>我的第一个servlet app</title><body> hello "+servletName+"</body></html>");
System.out.println("---------------------------"); } }
① 在浏览器中首次输入:http://localhost:8080/one/myFirstServlet
页面显示如下:
控制台:
②再次刷新页面:html页面依然不变
控制台:证明service方法会被调用多次,而init只被调用一次。
③此时在关闭服务器,控制台输出:可见destory方法在关闭容器后执行了
四. 关于init方法中传递的两个参数ServletRequest和ServletResponse
1. ServletRequest
① 客户端的每一次请求,Servlet容器都会创建一个ServletRequest实例,并将它传递给service方法。
Servlet封装客户端请求的相关信息。
② ServeltRequest接口的主要方法如下:
public int getContentType() //返回请求主体的MIME类型 public java.lang.String getParameter(java.lang.String name) //根据String类型的参数返回对应的值 public int getContentLength() //返回请求主体中的字节数
我们平时最常用的就是上面红色标注的方法。
例如使用如下url调用一个Servlet:
http://localhost:8080/myapp/myservelt?id=10
则在Servelt类中的service方法中使用ServletRequest就可以拿到这个值:ServletRequest.getParameter("id");
此外,如果传递给此方法的的字符不存在,该方法返回null。
2. ServletResponse
①ServletResponse接口表示一个Servlet响应。
在调用Servlet之前,Servlet容器都会创建一个ServletResponse并将其传递给service方法。
②ServletResponse接口常用方法
public java.io.PrintWriter getWriter() throws java.io.IOException //返回可以将文本传给客户端的java.io.PrintWriter实例 public void setContentType(java.lang.String type) //在给客户端发送响应之前设置响应内容类型,例如 text/html,即发送的响应的类型为html。另外如果不进行设置,有些浏览器默认以html格式显示,有些浏览器默认以文本格式显示
该对象的应用在前面3.8的小实例中已经演示过,就不在演示了。
五. ServletContext
1. ServletContext表示Servlet应用程序。且每一个web应用程序只有一个ServletContext。
2. 同一个web应用的所有servlet对象共享一个ServletContext。Servlet对象可以通过它来访问容器中的各种资源。
3. ServletContext 接口常用方法
public void setAttribute(java.lang.String name,java.lang.Object object) //把一个java对象和一个属性名绑定,并存放到ServletContext中,参数name指定属性名,参数Object表示共享数据。 public java.lang.Object getAttribute(java.lang.String name) //根据参数给定的属性名,返回一个Object类型的对象。 和setAttribute方法是对应的 public java.util.Enumeration getAttributeNames() //返回一个Enumeration对象,该对象包含了所有存放在ServletContext中的属性名。 public void removeAttribute(java.lang.String name) //根据参数指定的属性名,从servletContext对象中删除匹配的属性。
public java.lang.String getServletContextName() //返回当前web应用的URL入口。 public java.lang.String getInitParameter(java.lang.String name) //返回web应用方位内的匹配的初始化参数值。在web.xml中<web-app>元素中<context-param>元素表示应用范围内的初始化参数。其作用同下面六中所讲的的ServletConfig的getInitParameter()方法
public java.util.Enumeration getInitParameterNames() //返回一个Enumeration对象。 public java.lang.String getServletContextName() //返回web应用的名字。即<web-app>元素中<display-name>元素的值。
六. ServletConfig
1. Servlet封装了@WebServlet 或者 web.xml 中Servlet的配置信息。
2. 这样的信息叫做初始参数。初始参数由两部分组成:键和值。
3. 那么如何去获取初始参数的值呢? ServletConfig提供了两个方法:
public java.lang.String getInitParameter(java.lang.String name) //传递String类型的键,获取键对应的值 public java.util.Enumeration getInitParameterNames() //返回所有初始参数名称(也就是键)的一个Enmueration
4. ServletConfig还封装了对ServletContext的操作。
public ServletContext getServletContext) //返回当前web应用的ServletContext实例
5. ServletConfig小实例演示。
package com.hjj.servlet.one; import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet; @WebServlet(name="testServiceConfig",urlPatterns="/testServiceConfig",
initParams={
@WebInitParam(name="email",value="test@qq.com"),
@WebInitParam(name="name",value="test")
})
public class TestServiceConfig implements Servlet {
private ServletConfig servletConfig = null;
@Override
public void destroy() {
} @Override
public ServletConfig getServletConfig() {
return this.servletConfig;
} @Override
public String getServletInfo() {
return "myFirstServlet";
} @Override
public void init(ServletConfig arg0) throws ServletException {
this.servletConfig = arg0;
} @Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
System.out.println("service被调用了");
String name = this.servletConfig.getInitParameter("name");
String email = this.servletConfig.getInitParameter("email");
System.out.println();
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
PrintWriter pw = response.getWriter();
pw.print("<html><head><head><title>testServletConfig</title><body>我的姓名 name:"+name+"<br>我的邮箱email:"+email+"</body></html>"); }
}
浏览器输入:http://localhost:8080/one/testServiceConfig
页面显示:
Servlet和JSP读书笔记(一)的更多相关文章
- Servlet和JSP读书笔记(二)
一. GenericServlet 1. 前面写的 Servlet和JSP学习笔记(一) 中的实例都是通过实现Servlet接口编写的,这样存在的问题就是:你必须实现Servlet中的所有方法,而不管 ...
- Servlet和JSP读书笔记(三)之Cookie
一. 浏览器和服务器之间通信的简单介绍引出Cookie和Session(只是简单的简介,不包含协议方面的知识) 1.当我们在浏览器中输入一个地址后,回车后就可以看到浏览器给我们展示的漂亮页面.在这个过 ...
- how tomcat works 读书笔记(二)----------一个简单的servlet容器
app1 (建议读者在看本章之前,先看how tomcat works 读书笔记(一)----------一个简单的web服务器 http://blog.csdn.net/dlf123321/arti ...
- javaweb servlet jsp简单笔记
第二章: 1: web 俗称 : 万维网 www 2: web开发 的三大核心: HTML(网页) ,URL(定位),HTTP:(协议) 页面的分类: 静态页面: html+css 动态页面:jsp ...
- jsp课堂笔记5 Java servlet
servlet的创建 servlet类就是一个包含javax.servlet.http包中的HttpServlet类 部署web.xml文件 在<sevlet>标签中创建 <serv ...
- Struts2技术内幕 读书笔记三 表示层的困惑
表示层能有什么疑惑?很简单,我们暂时忘记所有的框架,就写一个注册的servlet来看看. index.jsp <form id="form1" name="form ...
- Key Technologies Primer 读书笔记,翻译 --- Struct 学习 1
原文链接:https://struts.apache.org/primer.html 本来想写成读书笔记的,结果还是变成翻译,谨作记录,学习. 1.HTML -- 见我前面文章 2.Interne ...
- JSP学习笔记
JSP学习笔记 Jsp网页主要分为Elements与Template Data两部分. Template Data:JSP Container不处理的部分,例如HTML内容 Elements:必须经由 ...
- [读书笔记]C#学习笔记八:StringBuilder与String详解及参数传递问题剖析
前言 上次在公司开会时有同事分享windebug的知识, 拿的是string字符串Concat拼接 然后用while(true){}死循环的Demo来讲解.其中有提及string操作大量字符串效率低下 ...
随机推荐
- java 发送邮件 email相关操作代码测试,生成复杂格式邮件,发送邮件相关操作
项目源码下载:http://download.csdn.net/detail/liangrui1988/6720047 效果图: 相关代码: test1 package com.mail; impor ...
- gethostbyname()函数说明
gethostbyname()函数说明——用域名或主机名获取IP地址 包含头文件 #include <netdb.h> #include <sys/socket.h> ...
- Mac编程的官方文档(类似MSDN)
https://developer.apple.com/library/mac/documentation/FileManagement/Conceptual/FileSystemProgrammin ...
- 从头学Qt Quick系列
http://www.cnblogs.com/csulennon/category/686605.html
- Django的url解析
Django中采用正则表达式来匹配所请求的url,这个叫做URLconf,作为MVC中的C(控制器), 这样再调用相应的试图,达到控制器控制试图的显示的效果. 看一下Django的url解析过程 第一 ...
- Oracle成长点点滴滴(3)— 权限管理
上篇我们解说了创建用户以及主要的授权问题.以下我们来解说权限包含对象权限和系统权限. 事实上上节课我们解说就是系统的权限.系统权限就是一些创建表了,表空间等等的系统的权限. 1. 系统权限 ...
- C#面向对象2 静态类、静态成员的理解
理解:静态成员属于类所有,为各个类的实例所公用,与实例无关,需要全局共享的属性或者方法定义成静态的 C#静态成员: 1.静态成员属于类所有,故用类名调用,非静态成员属于类的实例所有,用实例名调用 ...
- UpdatePanel和jQuery不兼容
在做项目中发现,在使用了UpdatePanel的地方,局部刷新后,jquery失效了. 后来网上一查,才发现,jquery中的ready事件会在DOM完全加载后运行一次,而当我们实用了UpdatePa ...
- http://www.cutt.com/
简网APP工场-服务介绍 服务介绍
- 阿根廷探戈(Argentine Tango)舞步
阿根廷探戈(Argentine Tango)舞步 阿根廷探戈(Argentine Tango)舞步 2011-11-22 13:05:11 不像其它大部分的社交舞,阿根廷探戈没有固定的舞步,它是一 ...