1. 引子:

当我们开始进入JavaWeb开发的学习时,我们就必须要和ServletHTTP这两个词进行打交道了,尤其是Servlet。即使到了后面使用JSP (我们知道JSP其本身就是一个Servlet)来进行开发我们的应用。

下图就是 Servlet API中相应的UML图,在学习JavaWeb 开发时,我们最好对下面的各个Servlet中的方法做一定的了解及其相应的图中的关系,尤其是HttpServletRequestHttpServletResponse 中的方法。

2. 部署服务器(TomCat):

Tomcat:是开源的 Servlet 容器.

下面的图片是TomCat 的目录结构:(在此就不在赘述各个目录结构的介绍了!)

可以通过修改 server.xml 文件中的配置信息来修改 Tomcat 服务器的端口号:

 <Connector port="8989" protocol="HTTP/1.1"

            connectionTimeout="20000"

            redirectPort="8443" />

把 port 的值改为其他的端口号即可.

其中我们写的web应用项目需要部署在webapps目录下。

3. WEB 开发的目录结构:

其实对于 JavaWeb 应用开发而言,我们必须清楚的知道在 web容器中 JavaWeb 的目录结构,这是学习JavaWeb开发的关键,我们可以通过查看 TomCat 给我们提供的文档来了解web应用的目录结构,而不要一开始就使用开发工具,如Eclipse或MyEclipse中 JavaEE 视图来进行web 应用的开发。虽然这些应用可以帮助你来进行快速的进行开发,但是对于初学者而言,往往会将Web应用的目录结构搞混乱!!!故而不建议直接使用JavaEE视图来进行JavaWeb应用的开发。下面就来说一下web 应用的目录结构:


- - WebContent(根目录)

- - WEB-INF(WEB-INF下必须要有classes包,lib包,web.xml文件。)

- - classes (编译后的 class 文件必须放在该目录下.名字必须为classes.)

- - lib(目录:存放第三方 jar 包)

- - web.xml(web应用的配置文件.)

- - *.jsp、*html、image 等等.文件或目录包。


上面的目录结构图就是部署在web容器上的目录,这和Eclipse中JavaEE视图下开发的目录结构还是有很大的区别的!

4. JavaWeb应用的第一个HelloWorld 程序(Servlet):

当我们了解了JavaWeb应用的目录结构后,就来开始开发我们的第一个JavaWeb应用项目吧!在此由于我们已经熟悉了JavaWeb 应用的目录结构了,所以接下来我们就使用开发工具来开发我们的 Web应用。

在Eclipse中JavaEE视图中建一个Dynamic Web Project.如下:在Eclipse中的目录结构:

4. 1. 第一个HelloWord Web 应用

建立我们的第一个HelloWord Web应用(一定要记着引子中的Servlet 接口的UML图,这是你在学习 Servlet接口及实现类时最重要的思路条理):

4.1.1 .  创建一个 Servlet 接口的实现类.

  public class HelloServlet implements Servlet{

 //并实现接口中的方法在该类中我并没有实现下列方法。

 @Override

 init(ServletConfig config);

 ServletConfig getServletConfig();

 service(ServletRequest req, ServletResponse res);

 String getServletInfo();

 void destroy();

 //并添加该实现类的构造器.

     public HelloServlet() {}

 }

4.1.2.   在 web.xml 文件中配置和映射这个 Servlet:

 <!-- 配置和映射 Servlet -->
<servlet>
<servlet-name>helloservlet</servlet-name>
<servlet-class>cn.vincent.web.servlet.HelloServlet</servlet-class>
</servlet>
<!—
其中对于路径的映射而言我们可知:/ 代表的是 当前web应用的根路径,而不是 web容器( 服务器)站点的根路径。就现在我们使用的 servlet 容器而言是Tomcat ,其站点的根目录为:http://localhost:8080/ ;而对于当前的 JavaWeb 应用而言其根路径为:http://localhost:8080/JavaWeb_001/ ;故而对于下面的 servlet-mapping映射中 url-pattern(访问路径)而言可以通过 在地址栏中输入 http://localhost:8080/JavaWeb_001/hello 来访问到 HelloServlet 文件。其实对于 JavaWeb 应用开发而言,我们必须清楚的知道在 web容器中 JavaWeb 的目录结构,这是学习JavaWeb开发的关键,我们可以通过查看 TomCat 给我们提供的文档来了解web应用的目录结构,而不要一开始就使用开发工具像Eclipse或MyEclipse中 JavaEE 视图来进行web 应用的开发。虽然这些应用可以帮助你来进行快速的进行开发,但是对于初学者而言,往往会将Web应用的目录结构搞混乱!!!
-->
<servlet-mapping>
<servlet-name>helloservlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>

4.1.3.   将JavaWeb项目部署到Tomcat容器中:

然后通过访问http://localhost:8080/JavaWeb_001/hello就能访问到我们刚刚部署的servlet了!

其中可以在tomcat 容器中运行 Servlet、JSP、Filter、Listener等等,它们的创建及它们的生命周期的方法都将在TomCat 容器中进行。下面就引出了Servlet 的生命周期的方法了!

4.1.4.   Servlet 的生命周期的方法:

1). 构造器: 只被调用一次. 只有第一次请求 Servlet 时, 创建 Servlet 的实例. 调用构造器.这说明 Serlvet 的单实例的!

2). init 方法: 只被调用一次. 在创建好实例后立即被调用. 用于初始化当前 Servlet. (其中很多人迷惑,既然有了构造器为什么还要用 init 方法来进行初始化当前的 Servlet 呢?我们在去看看init 方法:init(ServletConfig config);该方法的参数是ServletConfig config,我们通过参数类型的名字也可以看出这个方法就是用来进行初始化Servlet的,该参数的作用是用构造器来进行初始化Servlet替代不了的!)

3). service: 被多次调用. 每次请求都会调用 service 方法. 实际用于响应请求的.

4). destroy: 只被调用一次. 在当前 Servlet 所在的 WEB 应用被卸载前调用. 用于释放当前 Servlet 所占用的资源.

4.1.5.   load-on-startup 参数:

1).  配置在 servlet 节点中:

  <servlet>

             <servlet-name>helloservlet</servlet-name>

             <servlet-class>cn.vincent.web.servlet.HelloServlet</servlet-class>

 <!-- 可以指定 Servlet 被创建的时机 -->

         <load-on-startup>1</load-on-startup>

         </servlet>

2). load-on-startup: 可以指定 Serlvet 实例被创建的时机. 若为负数, 则在第一次请求时被创建.若为 0 或正数, 则在当前 WEB 应用被Serlvet 容器加载时创建实例, 且数值越小越早被创建.

4.1.6.     ServletConfig: 封装了 Serlvet 的配置信息, 并且可以获取 ServletContext 对象。

1). 配置 Serlvet 的初始化参数

 <servlet>

             <servlet-name>helloservlet</servlet-name>

             <servlet-class>cn.vincent.web.servlet.HelloServlet</servlet-class>

         <!-- 配置 Serlvet 的初始化参数。 且节点必须在 load-on-startup 节点的前面 -->

         <init-param>

             <!-- 参数名 -->

             <param-name>user</param-name>

             <!-- 参数值 -->

             <param-value>root</param-value>

         </init-param>

         <init-param>

             <param-name>password</param-name>

             <param-value>1230</param-value>

         </init-param>

 <!-- 可以指定 Servlet 被创建的时机 -->

         <load-on-startup>1</load-on-startup>

         </servlet>

2). 获取初始化参数:

> getInitParameter(String name): 获取指定参数名的初始化参数

> getInitParameterNames(): 获取参数名组成的 Enumeration 对象.

 // 通过 ServletConfig 对象获取初始化的参数。
String user = config.getInitParameter("user");
System.out.println("user = " + user);
System.out.println("============我是一条华丽的分割线=============");
// 通过 ServletConfig 对象获取初始化的参数名的集合。
Enumeration<String> initParameterNames = config.getInitParameterNames();
while (initParameterNames.hasMoreElements()) {
String name = (String) initParameterNames.nextElement();
String value = config.getInitParameter(name);
System.out.println("^^name = " + name + ", ^^value = " + value);
}

在控制台输出的结果:

3). 获取 Serlvet 的配置名称:

 String servletName = config.getServletName();
System.out.println(servletName);

4.1.7.    ***ServletContext:

1). 可以由  SerlvetConfig 获取:

 ServletContext servletContext = servletConfig.getServletContext();

2). 该对象代表当前 WEB 应用: 可以认为 SerlvetContext 是当前 WEB 应用的一个大管家. 可以从中获取到当前 WEB 应用的各个方面的信息.

  ①. 获取当前 WEB 应用的初始化参数

  设置初始化参数: 可以为所有的 Servlet 所获取, 而 Servlet 的初始化参数只用那个 Serlvet 可以获取. (上下文参数配置的位置切记不能放到Servlet标签内)

  

 <!-- 配置当前 WEB 应用的初始化参数 -->

 <context-param>

             <param-name>driver</param-name>

             <param-value>cn.vincent</param-value>

         </context-param>

         <context-param>

             <param-name>Vincent</param-name>

             <param-value>789654</param-value>

     </context-param>

  方法:

  getInitParameter

  getInitParameterNames

  代码:

  

 // 通过 ServletConfig 对象获取ServletContext (application) 对象。

         ServletContext servletContext = config.getServletContext();

         // 通过 ServletContext 对象获取为整个web项目配置的参数的信息。

         String Vincent = servletContext.getInitParameter("Vincent");

         System.out.println("Vincent = " + Vincent);

         System.out.println("============我是一条华丽的分割线=============");

         Enumeration<String> contextParameterNames = servletContext.getInitParameterNames();

         while (contextParameterNames.hasMoreElements()) {

             String name = (String) contextParameterNames.nextElement();

             String value = servletContext.getInitParameter(name);

             System.out.println("^^name = " + name + ", ^^value = " + value);

         }

  在控制台输出的结果:

  

  ②. 获取当前 WEB 应用的名称: (上下文的路径:即web项目的根路径,是一个相对路径。)

  getContextPath()

  代码:

  

 String contextPath = servletContext.getContextPath();

     System.out.println(contextPath);

  ③. 获取当前 WEB 应用的某一个文件在服务器上的绝对路径,参数为一个相对路径.

  getRealPath(String path);

  代码:

  

 String realPath = servletContext.getRealPath(contextPath);

             System.out.println(realPath);

  getContextPath()、getRealPath(String path)在控制台输出的结果:

  

  ④. 获取当前 WEB 应用的某一个文件对应的输入流. 参数为一个相对路径.(相对于当前web应用的根目录的路径 ( path 的 / 为当前 WEB 应用的根目录 ))

  getResourceAsStream(String path):

  代码:

  

 InputStream is = servletContext.   getResourceAsStream("/WEB-INF/classes/jdbc.properties");

  ⑤. 和 attribute 相关的几个方法: 参见:http://www.cnblogs.com/Vincent-NMT/p/6062571.html  中的 1.8.  域对象(和属性相关的方法)。

4.1.8.    GET 请求和 POST 请求:

    在说关于 GET请求 和 POST 请求前我们先来说一下HTTP协议,在web浏览器与web服务器之间进行的一问一答的过程中需要遵循一定的规定,而这个规定就是HTTP协议。HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于定义web浏览器与web服务器之间交换数据的过程及数据本身格式的传输协议。

HTTP的会话方式:客户机与服务器间需要四步才能进行通信:1、建立连接,2、发送送请求信息,3、响应请求信息,4、关闭连接。

  1). 使用GET方式传递参数:

    ①. 在浏览器地址栏中输入某个URL地址或单击网页上的一个超链接时,浏览器发出的HTTP请求消息的请求方式为GET。

    ②. 如果网页中的<form>表单元素的 method 属性被设置为了“GET”,浏览器提交这个FORM表单时生成的HTTP请求消息的请求方式也为GET。

    ③. 使用GET请求方式给WEB服务器传递参数的格式:

    http://www.cnblogs.com/Vincent-NMT/index.jsp?name=lc&password=123

    ④. 使用GET方式传送的数据量一般限制在 1KB 以下。

例如下图事例:


  2). 使用 POST 方式传递参数:

    ①. POST 请求方式主要用于向 WEB 服务器端程序提交 FORM 表单中的数据: form 表单的 method 置为 POST

    ②. POST 方式将各个表单字段元素及其数据作为 HTTP 消息的实体内容发送给 WEB 服务器,传送的数据量要比使用GET方式传送的数据量大得多。

例如下图事例:


4.1.9.    如何在 Serlvet 中获取请求信息:

    1). Servlet 的 service() 方法用于应答请求: 因为每次请求都会调用 service() 方法

    

 public void service(ServletRequest req, ServletResponse res)

    ServletRequest: 封装了请求信息. 可以从中获取到任何的请求信息.

    ServletResponse: 封装了响应信息, 如果想给用户什么响应, 具体可以使用该接口的方法实现.

 这两个接口的实现类都是服务器给予实现的, 并在服务器调用 service 方法时传入.

    2). ServletRequest: 封装了请求信息. 可以从中获取到任何的请求信息.

      ①. 获取请求参数:

       > String getParameter(String name): 根据请求参数的名字, 返回参数值.注意:若请求参数有多个值(例如 checkbox), 该方法只能获取到第一个提交的值.

         > String[] getParameterValues(String name): 根据请求参数的名字, 返回请求参数对应的字符串数组.

       > Enumeration getParameterNames(): 返回参数名对应的 Enumeration 对象,类似于 ServletConfig(或 ServletContext) 的 getInitParameterNames() 方法.

       > Map getParameterMap(): 返回请求参数的键值对: key: 参数名 ,String类型,  value: 参数值 , String 数组类型.

      ②. 获取请求的 URI:(此时需要将ServletRequest类型向下转型为HttpServletRequest类型,因为获取请求的URI相关方法是在 ServletRequest 其子接口HttpServletRequest中实现的)   

 HttpServletRequest httpServletRequest = (HttpServletRequest) req;
String requestURI = httpServletRequest.getRequestURI();
// /JavaWeb_001/loginServlet
System.out.println(requestURI);

     ③. 获取请求方式:

     String method = httpServletRequest.getMethod();
//GET
System.out.println(method);

      ④. 若是一个 GET 请求, 获取请求参数对应的那个字符串, 即 ? 后的那个字符串.

     String queryString = httpServletRequest.getQueryString();
// user=Vincent&pwd=123
System.out.println(queryString);

      ⑤. 获取请求的 Serlvet 的映射路径

   

 String servletPath = httpServletRequest.getServletPath();

     System.out.println(servletPath);  //  /loginServlet 

  其还有大量的方法,在此就不进行一一实现了!读者可以查阅相应J2EE 的 JavaDoc 文档 的方法进行实现。

      ⑥. 和 attribute 相关的几个方法: http://www.cnblogs.com/Vincent-NMT/p/6062571.html  中的 1.8.  域对象(和属性相关的方法)。

    3). HttpServletRequest: 是 SerlvetRequest 的子接口. 针对于 HTTP 请求所定义. 里边包含了大量获取 HTTP 请求相关的方法.

    4). ServletResponse: 封装了响应信息, 如果想给用户什么响应, 具体可以使用该接口的方法实现.

      ①. *getWriter(): 返回 PrintWriter 对象. 调用该对象的 print() 方法, 将把 print() 中的参数直接打印到客户的浏览器上.

       ②. 设置响应的内容类型:

 response.setContentType("application/msword; charset=utf-8 ");

         设置响应的编码方式:

 response.setCharacterEncoding("utf-8");

      ③. 请求的重定向. (此方法为 HttpServletResponse 中定义.)

 void sendRedirect(String location)

JavaWeb学习笔记之Servlet(一)的更多相关文章

  1. JavaWeb学习笔记:Servlet

    Servlet JavaWeb 概念 Java Web应用由一组Servlet.HTML页面.类.以及其他能够被绑定的资源构成. 他能够在各种供应商提供的实现Servlet规范的Servlet容器中执 ...

  2. JavaWeb学习笔记之Servlet(二)

    1.  GenericServlet 抽象类: 1). 是一个 Serlvet. 是 Servlet 接口和 ServletConfig 接口的实现类. 但是一个抽象类. 其中的 service 方法 ...

  3. JavaWeb学习笔记三 Servlet

    Servlet 是运行在服务端的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求.响应给浏览器的动态资源.但servlet的实质就是java代码,通过java的API,动态的向客户 ...

  4. JavaWeb学习笔记总结 目录篇

    JavaWeb学习笔记一: XML解析 JavaWeb学习笔记二 Http协议和Tomcat服务器 JavaWeb学习笔记三 Servlet JavaWeb学习笔记四 request&resp ...

  5. javaweb学习笔记整理补课

    javaweb学习笔记整理补课 * JavaWeb: * 使用Java语言开发基于互联网的项目 * 软件架构: 1. C/S: Client/Server 客户端/服务器端 * 在用户本地有一个客户端 ...

  6. Java学习笔记之---Servlet

    Java学习笔记之---Servlet (一)如何实现Servlet 1.实现javax.servlet.Servlet接口: 2.继承javax.servlet.GenericServlet类: 3 ...

  7. JavaWeb学习总结-04 Servlet 学习和使用

    一 Servlet 1 Servlet概念 Servlet时运行在服务器端的Java程序. Servlet的框架核心是 javax.servlet.Servlet 接口. 所有自定义的Servlet都 ...

  8. javaweb学习总结(六)——Servlet开发(二)

    一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些 ...

  9. javaweb学习总结(六)——Servlet开发(二)(转)

    转载自 http://www.cnblogs.com/xdp-gacl/p/3763559.html 一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文 ...

随机推荐

  1. C#的tooltip自动消失之后就不再显示了解决办法

    转:http://www.51testing.com/?uid-569418-action-viewspace-itemid-832231 在控件上加上tooltip之后,鼠标放到控件上,toolti ...

  2. Thinkphp 控制器

    控 制 器: 1.命名方法:新建一个主页面的控制器 controller文件夹下新建一个文件,命名为:MainController.class.php首字母都大写,称为驼峰命名法 eg: <?p ...

  3. ubuntu 下 github 使用方法 以及异常修改

    接触github很长时间了,github有windows 跟 mac 版本,恶心的是现在在linux 下没有可视化界面的版本.所以对于很多没有怎么接触过github的人带来很大困难.话不多说,彪重点: ...

  4. 用dup2和dup产生一份file descriptor 的拷贝

    在类Unix操作系统里面,.dup2和dup都通过系统调用来产生一份file descriptor 的拷贝.   dup对我来说还很简单   int dup(int filedes);   dup2就 ...

  5. Xcode中将图片放入Images.xcassets和直接拖入的区别

    将图片放入Images.xcassets 在mainBundle里面Xcode会生成一个Assets.car文件,将我们放在Images.xcassets的图片打包在里面.(程序会变大(?)) 无论是 ...

  6. 手机页面关于头部固定定位与input出现的问题

    前些天写了一个页面,要求头部导航进行固定定位position:fixed.内容区域有输入框input.在大多数手机上都是显示正常的,可偏在一些低版本的手机却出现问题了. 把我给苦恼的不行. 问题:头部 ...

  7. 关于接口使用getType的方法的问题

    C#代码如下:    public interface IConfigInfo    {    }    public class A : IConfigInfo    { }    public c ...

  8. 转:40多个关于人脸检测/识别的API、库和软件

    文章来自于:http://blog.jobbole.com/45936/ 自从谷歌眼镜被推出以来,围绕人脸识别,出现了很多争议.我们相信,不管是不是通过智能眼镜,人脸识别将在人与人交往甚至人与物交互中 ...

  9. ng-class的使用

    例如: td(ng-class="{0:'text-warning',1:'text-primary'}[bj.flag]") {{bj.flag | bjFlagfilter}} ...

  10. 负电压基准电路(-2.5V/-5V电压基准)

    运算放大器大多数都是双电源的,这就要求有正负基准电压,除了从稳压源直接输出电压外,很多时候都是一个单电源对整个电路供电,这就要求要把正电压转换成负电压,从而产生正负的电压基准,对双电源运算放大器进行供 ...