(1)servlet介绍和接口方式写servlet(*通配符、web.xml详解)及常见错误

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jiangshangchunjiezi/article/details/77581596

一、servlet概念和特点
servlet(Java服务器小程序)是用Java编写的服务器端程序。
特点:
①它是由服务器端(Tomcat)调用和执行的
②它是用Java语言编写的,就是Java程序(Java类)
③该Java程序要遵循servlet的开发规范
④servlet功能强大,几乎可以完成所有网站功能(例如网上付款)
⑤是学习jsp基础
二、为什么需要servlet技术?
比如需求,我们希望你用户可以发帖、回复….这样一些和用户可以交互的功能,用普通的Java技术不能完成,sun就开发了servlet技术供程序员使用。

三、Tomcat与servlet在网络中的位置

这里写图片描述

四、servlet在web应用中的位置
这里写图片描述

五、开发servlet有三种方法之一:实现servlet接口
需求:实现接口的方式,开发一个servlet,要求servlet可以显示hello world,同时显示当前的时间
步骤:
1.建立一个web应用 jdjweb文件
2.在jdjweb下建立WEB-INF/web.xml[可以从ROOT/WEB-INF/web.xml复制过来,然后将descrip标签去掉]
3.在jdjweb下建立WEB-INF/lib文件
4.在jdjweb下建立WEB-INF/classes下开发myFirst.java

package  com.jdj;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class myFirst implements Servlet
{
      //该函数用于初始化servlet,就是把该servlet装载到内存中,只被调用一次
      public void init(ServletConfig config)throws ServletException{}

     //得到ServletConfig对象
      public ServletConfig getServletConfig(){  return null;}

     //该函数时服务函数,我们的业务逻辑代码就是写在这里,该函数每次都会调用
     public void service(ServletRequest req,ServletResponse res)throws ServletException,java.io.IOException{
     System.out.println("hello, world"+new java.util.Date());//在控制台输出

     res.getWriter().println("hello, world"+new java.util.Date().toLocaleString());//在网页输出
}

     //该函数是得到servlet的配置信息
     public java.lang.String getServletInfo(){return null;}

     //该函数用于销毁该servlet,从内存中清除,该函数也是被调用一次
     public void destroy(){}


}

5.根据servlet规范还需要部署servlet
在web.

<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   version="2.5">
<!--根据servlet规范,需要servlet部署到web.xml文件-->
   <servlet>  
        <!--servlet-name 给该servlet取个名字,即servlet注册名,名称任意,但是习惯上用该servlet资源名-->
        <servlet-name>myFirst</servlet-name><!--servlet-class,要指定该servlet放在哪个包下,这是servlet的全路径(包名+类名)形式如下:包/包..../类/lei,注意没有.java-->
        <servlet-class>com.jdj.myFirst</servlet-class></servlet>

   <!--servlet的映射,对一个已经注册的servlet的映射,其实可以写多个已注册的映射,可以写<url-pattern>/mySecond</url-pattern>-->
   <servlet-mapping>
<!--servlet-name 必须和上面的servlet-name一样,此名称为指定servlet的注册名称-->
        <servlet-name>myFirst</servlet-name><!--url-pattern 这里就是将来要访问该servlet的资源名部分,名称任意,但是习惯用servlet-name的名称,注意要有“/”,该名称为servlet访问路径-->
        <url-pattern>/myFirst</url-pattern></servlet-mapping>

</web-app>

细节1(注意上代码的解释):客户端是通过URL地址访问web服务器中的资源,所以servlet程序若想要被外界访问,必须把servlet程序映射到一个URL地址上这个工作在web.xml文件中使用<servlet>元素(用于注册servlet)和<servlet-mapping>元素(用于映射一个已注册的servlet的一个对外访问路径)完成
细节2:即同一个Servlet可以被映射到多个URL上,甚至<url-pattern>/mySecond.html</url-pattern>这个URL的可以任意,写成.html也可以
*细节3:**URL也可以使用通配符
①/开头并以/*结尾已经注册的servlet名称的映射,写<url-pattern>/*</url-pattern>,对于访问该servlet名称的任何资源都数据特定的内容,url可以不存在,但是能显示特定的内容,更能体现用户友好
②比如搜狐的新闻网站,要显示所有的新闻资源<url-pattern>/new/*</url-pattern>
拓展名,比如*.do *.ss <url-pattern>*.do</url-pattern> ,在网页显示时可以写任意名称http://localhost:8080/TongPeiFu(已经注册的servlet名)/hahhah.do
在通配符匹配时,要参考的标准:
(1)看匹配度高低,即请求URL和已经映射的URL相似度
(2)*.do的优先级最低
通配符的价值:在网站需要停休时,可以先将web-xml中的所有映射和注册删除,然后改为/*即可。

开启http://localhost:8080/jdjweb/myFirst

常见错误
(1)在《servlet-mapping》中《servlet-name》myFirst1《/servlet-name》
与《 servlet》中对应标签不一致,则会报错

1)java.lang.reflect.InvocationTargetException
2)Parse error in application web.xml file at jndi:/localhost/jdjweb/WEB-INF/web.xml
org.xml.sax.SAXParseException; systemId: jndi:/localhost/jdjweb/WEB-INF/web.xml; lineNumber: 37; columnNumber: 23; Error at (37, 23) : Servlet mapping specifies an unknown servlet name myFirst1
在服务器启动时,就会将类webapps中所有类加载如内存,根据反射。按照web.xml中标识的①②③④来找,在③处中断,报错。在服务器启动时就会报错。
(2)在④处写com.jdj.myFirst.java
javax.servlet.ServletException: Wrapper cannot find servlet class com.jdj.myFirst.java or a class it depends on
服务器认为com.jdj.myFirst.java,为类名,实际并没有。在服务器启动时不会报错,在浏览器运行时会报错。【错误500】
(3)在浏览器访问资源时,没有这个资源,写的不是①标签内容,会在浏览器启动时,报404错误。

展开阅读全文

没有更多推荐了,返回首页