后端开发:【JavaWeb开发之Servlet的两种配置方式】

一、What.

Servlet 为何物?两种配置方式是什么?

Servlet狭义指的就是一个叫做“Servlet”的接口,广义指实现了这个接口的Java程序,运行在服务端,用来处理任何类型的请求、扩展基于HTTP协议的Web服务器。
两种配置方式为XML标签式和注解式。

二、Why.

  编写Servlet为什么还要配置?

当我们要开发编写一个针对请求的处理类,只实现Servlet接口是不行的。就像你造的酒很香,但是客人不知道去哪买一样。这是你要贴出标语、路标作为指示说明。类似的,你编写的“香喷喷”的Servlet实现类,也要配置说明下(“打个广告”),让外来的请求能够找到对应的处理类。

三、How.

 两种方式如何配置?

知识点其实不多,但为了让我们学习知识更有兴趣,我们每练习一个Demo应该给它赋予一个场景需求。
本次Demo练习,我们用两种配置方式做一个Servlet相关的查看兑奖号码的例子。

(一)XML标签式配置.

在Servlet 3.0版本之前,Servlet的配置说明只能通过在WEB-INF 目录下的web.xml文件中添加标签的形式。

<web-app>
      <servlet>
        <!--servlet的昵称、代号,共下文中的引用-->
        <servlet-name>CheckNumber</servlet-name>

        <!--servlet对应的类文件,包名+类名-->
        <servlet-class>com.breaker.servlet.CheckServlet</servlet-class>

        <!--servlet内部的初始化参数,非必需配置-->
        <init-param>
            <param-name>user</param-name>
            <param-value>Breaker93</param-value>
        </init-param>
        <init-param>
            <param-name>my_jianshu_url</param-name>
            <param-value>http://www.jianshu.com/u/187408ee66d4</param-value>
        </init-param>

        <!--通知Servlet容器(“tomcat”)在启动的时候初始化创建该Servlet的实例,非必需配置 -->
        <load-on-startup>1</load-on-startup>

    </servlet>


    <servlet-mapping>

        <!--为代号为“CheckNumber”的Servlet设置浏览器访问地址(要与上文中的Serlet
        的代号名称一致,否则会找不到的),
        例如http://192.168.0.100:8080/DemoProject/checkNumber -->
        <servlet-name>CheckNumber</servlet-name>

        <!--此处的名称与servlet-name的值无关,随便设置的,
                  只为了浏览器中请求方便 -->
        <url-pattern>/checkNumber</url-pattern>

    </servlet-mapping>
</web-app>

此种配置中的Servlet实现类是这样编写的:

//HttpServlet继承了GenericServlet类,GenericServlet继承了Servlet接口,
//他们都是Servlet API提供,非个人编写的;所以CheckServlet是间接实现的Servlet接口。
public class CheckServlet extends HttpServlet{
    
    //处理get请求,在此方法内编写处理逻辑。
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // TODO Auto-generated method stub
        System.out.println("我的简书链接:"+getServletConfig().getInitParameter("my_jianshu_url"));
        String[] number=req.getParameterValues("number");
        for(int i=0;i<7;i++){
            System.out.print(number[i]);
        }
        System.out.println("---------");
        String[] awardNum=new String[7];
        Random random=new Random();
        for(int i=0;i<7;i++){           
            awardNum[i] = random.nextInt(10)+"";
            System.out.print(awardNum[i]);
        }
        System.out.println("------");
        
        int count = 0,max = 0,position = 0;
        for(int i= 0;i<awardNum.length;i++){
            if(awardNum[i].equals(number[i])){
                count++;
                if (count>max) {
                    position=i;
                    max=count;
                }
            }else{
                count=0;
            }
        }
        req.setAttribute("number", number);
        req.setAttribute("awardNum", awardNum);
        req.setAttribute("bool", "");
        req.setAttribute("begin",8 );
        req.setAttribute("end", 8);
        String[] result = {"六等奖","五等奖","四等奖","三等奖","二等奖","一等奖"};
        if(max >1){
            req.setAttribute("bool", true);
            req.setAttribute("result","恭喜你中了" +result[max-2]);
            req.setAttribute("begin", position-max+1);
            req.setAttribute("end", position);
        }
        RequestDispatcher dispatcher = req.getRequestDispatcher("/showResult.jsp"); 
        dispatcher.forward(req, resp); 
    }
    //处理post请求,在此方法内编写处理逻辑。
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // TODO Auto-generated method stub
        super.doPost(req, resp);
        System.out.println("doPost() executed");
    }
    
}

Jsp页面中是这样请求的Servlet:

//checkNumber 与<url-pattern>/checkNumber</url-pattern>对应一致才能请求到;
//此种请求等同于action="http://127.0.0.1:8080/DemoProject/checkNumber"
<form  action="checkNumber">
    ...
    ... 
</form>

(二)注解式.

在Servlet 3.0版本之后,WEB-INF路径下的web.xml文件不再是必需的,但通常还是建议保留。提供的注解(annotation),使得不再需要在web.xml文件中进行Servlet的部署描述,简化开发流程。

开发Servlet 3.0的程序需要一定的环境支持。Servlet3是Java EE6规范的一部分,Tomcat需要Tomcat7才支持Java EE6,Tomcat7需要使用JDK6。

直接在Servlet实现类里配置:

//HttpServlet继承了GenericServlet类,GenericServlet继承了Servlet接口,
//他们都是Servlet API提供,非个人编写的;所以CheckServlet是间接实现的Servlet接口。

/*@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定义。
*   例如:@WebServlet(name="AnnotationServlet",value="/AnnotationServlet")。
*
*  也可以定义多个URL访问:
*  如@WebServlet(name="AnnotationServlet",urlPatterns={"/AnnotationServlet","/AnnotationServlet2"})
*  或者@WebServlet(name="AnnotationServlet",value={"/AnnotationServlet","/AnnotationServlet2"})
*/
@WebServlet(name="CheckNumber",urlPatterns={"/checkNumber"},initParams= {@WebInitParam(name = "my_jianshu_url", value = "http://www.jianshu.com/u/187408ee66d4")},loadOnStartup = 1)
public class CheckServlet extends HttpServlet{
    
    //处理get请求,在此方法内编写处理逻辑。
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // TODO Auto-generated method stub
        System.out.println("我的简书链接:"+getServletConfig().getInitParameter("my_jianshu_url"));
        String[] number=req.getParameterValues("number");
        for(int i=0;i<7;i++){
            System.out.print(number[i]);
        }
        System.out.println("---------");
        String[] awardNum=new String[7];
        Random random=new Random();
        for(int i=0;i<7;i++){
            
            awardNum[i] = random.nextInt(10)+"";
            System.out.print(awardNum[i]);
        }
        System.out.println("------");
        
        int count = 0,max = 0,position = 0;
        for(int i= 0;i<awardNum.length;i++){
            if(awardNum[i].equals(number[i])){
                count++;
                if (count>max) {
                    position=i;
                    max=count;
                }
            }else{
                count=0;
            }
        }
        req.setAttribute("number", number);
        req.setAttribute("awardNum", awardNum);
        req.setAttribute("bool", "");
        req.setAttribute("begin",8 );
        req.setAttribute("end", 8);
        String[] result = {"六等奖","五等奖","四等奖","三等奖","二等奖","一等奖"};
        if(max >1){
            req.setAttribute("bool", true);
            req.setAttribute("result","恭喜你中了" +result[max-2]);
            req.setAttribute("begin", position-max+1);
            req.setAttribute("end", position);
        }
        RequestDispatcher dispatcher = req.getRequestDispatcher("/showResult.jsp"); 
        dispatcher.forward(req, resp); 
    }
    //处理post请求,在此方法内编写处理逻辑。
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // TODO Auto-generated method stub
        super.doPost(req, resp);
        System.out.println("doPost() executed");
    }
    
}

四、Summary.

  • 两种配置方式不要混用,避免出现同时配置@WebServlet注解标记和web.xml中<servlet-name>等标签的现象。
  • 两种配置方式比较:
    XML配置形式,在需要修改Servlet的配置信息(比如初始化参数的值)时,只需在服务器访问目录直接修改web.xml文件而不需要修改java文件然后再重新编译成class文件;
    但是当web.xml文件中出现大量的Servlet配置时,就会显得冗杂,而注解方式让配置更方便、简练。

本节Demo源码GitHub下载:
https://github.com/Breaker-93/Demo0923breaker_Servlet.git
若有疑问、请留言。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容

  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,781评论 6 342
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,639评论 18 139
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,220评论 11 349
  • 本章聊一聊ServletContext 3.0规范中定义的注解以及在web应用中使用的框架和库的可插拔性的提升。 ...
    Lucky_Micky阅读 6,029评论 0 3
  • 很喜欢怀旧的东西,我们常说,人要向前看,活在当下,这话没错,但我还是执着地怀念过去,怀念那些时光,或欢乐,或悲痛,...
    CHOKL_小厘阅读 591评论 0 2