今天上班居然迟到了,昨天失眠了,看完吐槽大会实在不知道做些什么,刚好朋友给我发了两个JavaWeb的练习项目,自己就又研究了下,三四点才睡,可能周日白天睡的太多了,早上醒来已经九点多了,立马刷牙洗脸头都没洗打车到公司,到公司都十点半了,还好领导不错没有追究,谢谢老板谢谢陈工和同事们。下面开始今天正题。

上一篇博客介绍了Tomcat的工作流程以及Servlet的生命周期,偏重理论,今天这一篇博客介绍下Servlet的应用,偏重实验,由于内容比较多,打算每天在家写一点,争取这周把这一篇完成。

一、编写第一个Servlet

学习任何一门语言都是从HelloWorld开始,今天学习Servlet也是从HelloWorld开始。打开Eclipse,File->New->Dyanmic Web Project新建一个名为HelloWorld的项目。在src下新建一个Package,这里我命名为test。在包下新建一个命名为HelloWorld的Servlet.如下图,左图是新建右图是新建完成的目录结构。

在Servlet中写入几行简单的程序,来运行一下整体感知一下。

package com.test.cyw;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*; @WebServlet("/HelloWorld")
public class HelloWorld extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try
{
out.println("<html>");
out.println("<head>");
out.println("<title>HelloWorld</title>");
out.println("</head>");
out.println("<body>");
out.println("<h2>HelloWorld</h2>");
out.println("</body>");
out.println("</html>"); }
finally
{
out.close(); }
} protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { }
}

在浏览器中输入:http://localhost:8088/HelloWorld/HelloWorld,会显示下面的页面。

二、@WebServlet注解

假如输入小写的http://localhost:8088/HelloWorld/helloWorld,会出现错误的页面,如下图,这里可能会有疑问:为什么输入大写的就显示正常而输入小写的就报错呢?而且也没有和上一篇博客写的在web.xml中配置ServletName等这些参数也能运行。这是什么原因呢?

其实这主要是@WebServlet注解在起作用。Servlet3.0提供了注解(annotation),使得不再需要在web.xml文件中进行Servlet的部署描述,简化开发流程。开发Servlet3的程序需要一定的环境支持。Servlet3是Java EE6规范的一部分,MyEclipse10和Tomcat7都提供了对Java EE6规范的支持。Tomcat需要Tomcat7才支持Java EE6,Tomcat7需要使用JDK6。关于注解以后有机会会专门写一博客来研究它,这里主要是@WebServlet注解的使用。

使用@WebServlet将一个继承于javax.servlet.http.HttpServlet的类定义为Servlet组件。
@WebServlet有很多的属性:
  asyncSupported:声明Servlet是否支持异步操作模式。
  description:    Servlet的描述。
  displayName:     Servlet的显示名称。
  initParams:        Servlet的init参数。
    name:        Servlet的名称。
  urlPatterns:    Servlet的访问URL。
  value:          Servlet的访问URL。
  Servlet的访问URL是Servlet的必选属性,可以选择使用urlPatterns或者value定义。

这里我们对上面的代码稍作修改就可以实现大小写都支持。

package com.test.cyw;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*; /*@WebServlet("/HelloWorld")*/
@WebServlet(name = "HelloWorld", urlPatterns = {"/helloWorld","/HelloWorld"})
public class HelloWorld extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try
{
out.println("<html>");
out.println("<head>");
out.println("<title>HelloWorld</title>");
out.println("</head>");
out.println("<body>");
out.println("<h2>HelloWorld</h2>");
out.println("</body>");
out.println("</html>"); }
finally
{
out.close(); }
} protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { }
}

三、参数配置

1.Servlet的参数配置

上面使用@WebServlet注解来实现映射,不过要Servlet3.0以后才支持,在web.xml中配置是一比较常见的方式。还是以HelloWrold项目为demo,在web.xml中进行如下配置,也能达到@WebServlet注解的效果。配置在xml中的参数修改只需要重启下服务器就好,不用再修改Servlet类.

  <servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>com.test.cyw.HelloWorld</servlet-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/helloWorld</url-pattern>
<url-pattern>/helloWorld.aspx</url-pattern>
</servlet-mapping>

<servlet></servlet>是Servlet配置的开始和结束标记。

<servlet-name>指定一个变量,主要是为了配置<servlet-mapping>时使用。

<servlet-class>指定Servlet对应的类。

<init-param></init-param>配置初始化参数开始结束标记。

<param-name>参数名,主要是为以后获取提供name

<param-value>参数值,设置初始化参数的值

<servlet-mapping></servlet-mapping>Servlet映射关系配置开始结束标记,用户输入的url怎么找到对应的Servlet-Class就要靠它。

<servlet-name>HelloWorld</servlet-name>与上面<Servlet>配置的<servlet-name>一致。

<url-pattern>用户输入的url格式,可以使用通配符*或?。从javaee5开始可以配置多个,上面的代码中添加了一个后缀名为aspx的,这样也可以映射。

2.上下文的参数配置

由于<init-param>是用配置在Servlet的参数,只能供对应的一个Servlet使用。要想配置的参数是全局的可以供所有的Servlet使用,可以使用上下文参数。例如像控制用户上传图片的类型,只允许用户上传jpg或png类型的图片。可以在web.xml中做下面的配置。

  <context-param>
<param-name>ImageType</param-name>
<param-value>.jpg,.png</param-value>
</context-param>

四、请求与响应

在编程中请求与响应很常见,不仅仅是JavaWeb,其他语言也都有。先不说JavaWeb的请求响应,先从字面理解下。

请求:谁请求谁?客户端发起请求,客户端请求服务端。

响应:谁响应谁? 服务端做出响应,服务端响应客户端的请求。服务端是属于被动的。

一般是用户发起请求,服务端根据请求做出响应,发起是用户的操作,编程一般不关心,根据请求做出对应的响应是编程需要做的。在Toamcat接到请求后,servlet 容器创建 HttpServletRequest、HttpServletResponse对象,并将该对象作为参数传递给该 servlet 的 service 方法.具体使用由于内容比较多这里就不一一列举,可以下载api查看,在本博客中我也会附上链接,供大家下载。

五、web.xml参数读取

上面配置了一些初始化的参数,配置参数就是为了读取使用,如果不提供读取的方法,配置参数基本没啥用。

1.Servlet参数读取

获取Servlet初始化参数有两种方法。一是直接调用Servlet的getInitParameter("name")二是通过getServletConfig()获取ServletConfig再使用getInitParameter("name")方法获取

2.上下文参数读取

获取全局上下文参数可以先通过getServletContext()获取ServletContext对象,再使用getInitParameter("name")方法获取。

3.资源注射

上面的获取参数都是需要在Servlet中调用方法获取参数,有没有不编写程序获取的呢?答案是有。不然我也不会问这个。JavaEE5提供了一个解决方案叫做资源注射@Resource.不过只能配置java.lang包下的标准类型的数据。

下面的web.xml中分别配置Servlet初始化参数、全局上下文参数和注射参数。在Servlet中获取这些参数显示出来。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>HelloWorld</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>com.test.cyw.HelloWorld</servlet-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/helloWorld</url-pattern>
<url-pattern>/helloWorld.aspx</url-pattern>
</servlet-mapping>
<env-entry>
<env-entry-name>resourceStringA</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>hello,resourceStringA</env-entry-value>
</env-entry>
<env-entry>
<env-entry-name>resourceStringB</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>hello,resourceStringB</env-entry-value>
</env-entry>
<context-param>
<param-name>ImageType</param-name>
<param-value>.jpg,.png</param-value>
</context-param>
</web-app>
package com.test.cyw;

import java.io.IOException;
import java.io.PrintWriter; import javax.annotation.*;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*; /*@WebServlet("/HelloWorld")*/
/*@WebServlet(name = "HelloWorld", urlPatterns = {"/helloWorld","/HelloWorld"})*/
public class HelloWorld extends HttpServlet { private @Resource(name="resourceStringA") String resourceString1;
private @Resource(name="resourceStringB")
String resourceString2;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try
{
//直接获取
String servletParam=this.getInitParameter("encoding");
//通过ServletConfig对象获取
//servletParam=this.getServletConfig().getInitParameter("encoding");
//通过获取ServletContext对象获取
String contextParam=this.getServletContext().getInitParameter("ImageType");
out.println("<html>");
out.println("<head>");
out.println("<title>HelloWorld</title>");
out.println("</head>");
out.println("<body>");
out.println("<h2>HelloWorld</h2>");
out.println("<h2>ServletParam:"+servletParam+"</h2>");
out.println("<h2>ContextParam:"+contextParam+"</h2>");
out.println("<h2>ResourceString1:"+resourceString1+"</h2>");
out.println("<h2>ResourceString2:"+resourceString2+"</h2>");
out.println("</body>");
out.println("</html>"); }
finally
{
out.close(); }
} protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { }
}

六、Servlet生命周期

关于生命周期上一博客也写的比较清楚,这里主要介绍下@PreDestroy和@PostConstruct。

JavaEE5增加了两个影响生命周期的注解:@PreDestroy和@PostConstruct。被用来修饰非静态void()类型的不能抛出异常声明的方法。

    public @PostConstruct void PostConstruct()
{
System.out.println("构造函数后ini前");
}
@PreDestroy
public void PreDestory()
{
System.out.println("destory后Servlet卸载前");
}

七、Servlet间跳转

1.转向

在WebContent目录下新建一个test.jsp文件,在HelloWorld的Servlet中放入下面的代码,会跳转到test.jsp页面。

        RequestDispatcher dispatcher= request.getRequestDispatcher("/test.jsp");
dispatcher.forward(request, response);

2.重定向

转向是通过request来实现的,那重定向是通过response来实现。

        response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
response.setHeader("Location", "http://www.cnblogs.com/5ishare/");

3.自动刷新

response.setHeader("Refresh", "2000;URL=http://www.cnblogs.com/5ishare/");

八、Servlet线程安全

关于线程安全想必大家都练习过这样一个多线程取钱的练习。多线程操作一个变量会导致数据异常,最好不要在Servlet中声明全局变量。

九、遇到的问题

1.端口号问题

在创建完Servelt运行时不管是大写的HelloWorld还是小写的helloWorld,始终报错,这个仔细检查才发现是端口错误,由于自己在公司配置的环境Tomcat端口是8080,自己也习惯了直接输的也是8080,导致出错,自己查看了下本机Tomcat的端口号发现是8088,改过来之后能运行成功。

JavaWeb之Servlet总结的更多相关文章

  1. JavaWeb学习——Servlet相关的接口和类

    JavaWeb学习——Servlet相关的接口和类 摘要:本文主要学习了Servlet相关的接口和类. Servlet的接口和类 三种方式 实现Servlet有三种方式: 实现javax.servle ...

  2. JavaWeb之Servlet入门(二)

    1. 准备 在JavaWeb之Servlet入门(一)中,我们完成了第一个Servlet程序,完成了从URL到后台控制器的中转过程,接下来我们延续JavaWeb之Servlet入门(一)学习下如何传参 ...

  3. JavaWeb学习--Servlet认识

    Servlet开发 用户在浏览器中输入一个网址并回车,浏览器会向服务器发送一个HTTP请求.服务器端程序接受这个请求,并对请求进行处理,然后发送一个回应.浏览器收到回应,再把回应的内容显示出来.这种请 ...

  4. IDEA新建javaWeb以及Servlet简单实现

    刚开始用IDEA开发,还不太熟悉,因此写一个教程,加深印象 1.新建一个Web项目 两种方法:java 和 Java Enterprise(推荐) 第一种)通过Java工程创建,这个方法需要手动导入T ...

  5. Intellij IDEA创建javaWeb以及Servlet简单实现

    1.创建web工程 File --> New --> Project...

  6. javaweb之servlet 全解

    ①Servlet概述 ⑴什么是Servlet Servlet是JavaWeb的三大组件之一,它属于动态资源.Servlet的作用是处理请求, 服务器会把接收到的请求交给Servlet来处理,在Serv ...

  7. JavaWeb学习—Servlet

    1.什么是Servlet Servlet是一个继承HttpServlet类的Java类 Servlet必须部署在web服务器端,用来处理客户端的请求 2.Servlet运行过程 Web Client ...

  8. javaWEB之Servlet

    Servlet 1. 什么是Servlet  * Servlet是JavaWeb三大组件之一(Servlet.Filter.Listener)  * Servlet是用来处理客户端请求的动态资源  * ...

  9. Intellijidea建javaWeb以及Servlet简单实现

    一.创建并设置javaweb工程1.创建javaweb工程File --> New --> Project... 点击Project后出现如下界面,选择Java Enterprise,选中 ...

随机推荐

  1. html标签大全(2)

    http标签详解 声明 1:这里的文字都是我从我自己csdn账号拷贝过来,是本人学习总结的结晶,所以请尊重本作品.2:如要要转载本文章,则要说明文字的出处.3:如有哪里不对欢迎指出. 在上一篇文章中主 ...

  2. GCD简介

    什么是GCD 全称是Grand Central Dispatch,可译为"牛逼的中枢调度器" 纯C语言,提供了非常多强大的函数   GCD的优势 GCD是苹果公司为多核的并行运算提 ...

  3. Tomcat使用常见问题

    1,启动服务器,闪退问题 原因:tomcat软件是用java语言开发的,软件启动时,会默认到系统环境变量中查找一个名叫JAVA_HOME的变量.这个变量的作用是找到tomcat启动所需的JVM.   ...

  4. 面向UI编程:ui.js 1.0 粗糙版本发布,分布式开发+容器化+组件化+配置化框架,从无到有的艰难创造

    时隔第一次被UI思路激励,到现在1.0的粗糙版本发布,掐指一算整整半年了.半年之间,有些细节不断推翻重做,再推翻再重做.时隔今日,终于能先出来个东西了,这个版本很粗糙,主体功能大概能实现了,但是还是有 ...

  5. SQL SERVER运维日记--收缩数据库

    一个小故事 某天,小王正在和HR妹妹闲聊,正HAPPY时,,突然收到系统告警消息,数据库磁盘被剩余空间500M,OMG,不行,磁盘快满了,要是业务要停了,,那就小王只能删库到跑路了,,, 先检查下,有 ...

  6. DB2 表空间监控

    默认DB2 缓冲池信息监控是OFF, 需要开启(DB2表空间是由缓冲池分配的) CollBufferpool : ============ The CollBufferpool collector c ...

  7. Spring MVC 的环境搭建和入门小程序

    1.1.下载spring框架包. 1.1.1百度搜索Spring Framework. 进入spring官网,在网页右边选择想要下载的版本.如图 1.1.2进入页面按Ctrl+F搜索Distribut ...

  8. Top 10 Books For Advanced Level Java Developers

    Java is one of the most popular programming language nowadays. There are plenty of books for beginne ...

  9. java后端学习流程

    首先,我个人比较推崇的学习方法是:先学java前段,也就是HTML,css,js,因为学习java以后肯定是往java ee方向发展的,学习完前端,在学习后端很多东西比计较容易理解! 其中J2SE是关 ...

  10. .Net Standard扩展支持实例分享

    上篇(.Net基础体系和跨框架开发普及)介绍了.Net当前生态下的大概情况,也分享了简单实现的过程,这篇文章就是讲解我的OSS.Common项目扩展.Net Standard 支持的过程,主要集中在: ...