zoukankan      html  css  js  c++  java
  • servlet开篇

        今天在看关于servlet的知识,像java程序都继承了object类一样。servlet程序都是servlet的子类,意思是。全部servlet程序都要继承于servlet(可继承的类有:GenericServlet,HttpServlet)。

    在我写第一个servlet程序时,居然不用写web.xml文件。仅仅是在类的外面写了以下的一句话:

    @WebServlet(name="servletname",urlPttern={“/servletReaplace”});

    这是为什么呢?一開始我百思不得其解,在网上无意中看到一篇文章为我解开了困惑。

            

    Tomcat 7之无需JDK仅仅需JRE与无需web.xm及J2SE 6.0之真实与谎言?

    当然首先是确定一下,是真实的,吃个定心丸先,不是谎言:) 

    下载了Tomcat 7 RC4,解压到 D:OpenSourceTomcat7.0.0-RC4 文件夹下后 
    先将 JAVA_HOME 变量清除,假设你原先有设置 JAVA_HOME 变量的话,免得产生干扰 
    在命令行下,先取消 JAVA_HOME 变量 

    set JAVA_HOME= 

    然后设置 JRE_HOME 变量 

    set JRE_HOME=D:JRE1.6.0 

    再启动,就能够顺利开启了。。。

    。 
    cd /d D:OpenSourceTomcat7.0.0-RC4in 
    D:OpenSourceTomcat7.0.0-RC4in>startup.bat 

    当 然,也能够顺利地停止 
    D:OpenSourceTomcat7.0.0-RC4in>shutdown.bat 

    对 于习惯性设置 JAVA_HOME 变量的开发人员来说,假设仅是将它改为 JRE 所在的路径,想来试试,就会报错。 

    set JAVA_HOME=D:JRE1.6.0 

    然后 startup.bat 想启动之 
    cd /d D:OpenSourceTomcat7.0.0-RC4in 
    D:OpenSourceTomcat7.0.0-RC4in>startup.bat 

    嘿 嘿,启不来了。呵呵。报告 JAVA_HOME 变量设置不正确,应当指向JDK。而不是直接指向 JRE 路径了事 
    The JAVA_HOME environment variable is not defined correctly 
    This environment variable is needed to run this program 
    NB: JAVA_HOME should point to a JDK not a JRE
     

    可能会有疑问,不是明明文档里说仅仅须要JRE 6.0的吗? 
    Apache Tomcat 7.0 requires the Java 2 Standard Edition Runtime Environment (JRE) version 6.0 or later. 

    可是,正如前面设置 JRE_HOME 变量所说的。不信。再翻开文档去看一下,里面说得非常清楚是设置 JRE_HOME 变量,当然去看 setclasspath.bat 的脚本的详细内容可能更加可以了解清楚它 
    Set an environment variable named JRE_HOME to the pathname of the directory into which you installed the JRE 

    假设直接将 JRE 路径当作 JAVA_HOME,那则是习惯惹得错了,呵呵。

    只是话说回来,仅是配置 JRE_HOME 的情况比較少。都是设置过 JAVA_HOME 变量,然后 JRE_HOME 自己挂之,然后 PATH 里加上个 .;%JAVA_HOME%in 之类的。。。 

    真实谎言。事实上自从 Tomcat 5.5 開始。都说明仅仅须要 JRE 就能够执行了。

    仅仅只是 Tomcat 5.0 时候还是须要 JDK 1.3 才干够执行的。 

    由 于Tomcat 7必须是J2SE 6以上版本号才干够执行,那就试一下J2SE 5。看会有什么情况 

    set JAVA_HOME=D:JRE1.5.0 

    然后 startup.bat 想启动之 
    cd /d D:OpenSourceTomcat7.0.0-RC4in 
    D:OpenSourceTomcat7.0.0-RC4in>startup.bat 
    并 加上 -verbose 进行跟踪,能够得到例如以下具体的错误信息

    [Loaded java.io.IOException from shared objects file]  
    Exception in thread "main" java.lang.UnsupportedClassVersionError: Bad version number in .class file  
            at java.lang.ClassLoader.defineClass1(Native Method)  
            at java.lang.ClassLoader.defineClass(Unknown Source)  
            at java.security.SecureClassLoader.defineClass(Unknown Source)  
            at java.net.URLClassLoader.defineClass(Unknown Source)  
            at java.net.URLClassLoader.access$100(Unknown Source)  
            at java.net.URLClassLoader$1.run(Unknown Source)  
            at java.security.AccessController.doPrivileged(Native Method)  
            at java.net.URLClassLoader.findClass(Unknown Source)  
            at java.lang.ClassLoader.loadClass(Unknown Source)  
            at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)  
            at java.lang.ClassLoader.loadClass(Unknown Source)  
            at java.lang.ClassLoader.loadClassInternal(Unknown Source)  
    [Loaded java.lang.Shutdown from shared objects file]  
    [Loaded java.lang.Shutdown$Lock from shared objects file] 

    实际上,启动脚本先会认 JAVA_HOME 变量,在找到 JAVA_HOME 的情况下,会将 JAVA_HOME 赋值给 JRE_HOME,假设有定义 JRE_HOME 变量的话。则 JRE_HOME 变量是最优先的。比方。你定义

    JAVA_HOME=D:JDK1.6.0  
    JRE_HOME=D:JRE1.5.0 

    是执行不起来的。 

    事实上从Tomcat 5.5開始就不通过JDK去编译JSP了。而是通过Eclipse JDT Java编译器来编译JSP文件。 

    为了后面的试验方便。首先配置个管理用户,编辑 conf omcat-users.xml 配置文件, 
    因为Tomcat 7又一次定义了四个不同的角色来管理应用程序,而不是原来单一个manager角色,为此添加了角色为manager-gui的gui_admin用户,密 码password

    <role rolename="manager-gui"/>  
    <user username="gui_admin" password="password" roles="manager-gui"/> 

    为此。你须要设置不同的角色处理不同的管理内容,详细例如以下: 
    manager-gui - allows access to the HTML GUI and the status pages 
    manager-script - allows access to the text interface and the status pages 
    manager-jmx - allows access to the JMX proxy and the status pages 
    manager-status - allows access to the status pages only
     

    这样gui_admin能够訪问进行管理

    http://localhost:8080/manager/status  
    http://localhost:8080/manager/html 

    測试一下无需web.xml配置文件来创建一个Web应用程序项目 Tomcat7 
    通过注解编写一个Servlet,名为 AnnotationServlet.java

    @WebServlet("/AnnotationServlet")  
    public class AnnotationServlet extends HttpServlet   
    {  
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException   
    	{  
    		PrintWriter out = response.getWriter();  
    		out.println("Annotation Servlet in Tomcat 7");  
    	}  
    }  
    
    假设你用JDK 1.5来编译则会出错

    javac -cp D:OpenSourceTomcat7.0.0-RC4libservlet-api.jar *.java  
    AnnotationServlet.java:4: 无法訪问 javax.servlet.ServletException  
    错误的类文件: D:OpenSourceTomcat7.0.0-RC4libservlet-api.jar(javax/servlet/ServletException.class)  
    类文件具有错误的版本号 50.0。应为 49.0  
    请删除该文件或确保该文件位于正确的类路径子文件夹中。  
    import javax.servlet.ServletException;  
                         ^  
    1 错误  

    用1.6编译后。直接部署,启动,整个项目就一个 AnnotationServlet.class,启动后照样訪问

    http://localhost:8080/Tomcat7/AnnotationServlet

    当然一个Web项目,少了web.xml文件预计也是玩不转的,试一下通过注解与没有注解的Servlet共同工作的场景,创建一个 NoneAnnotationServlet.java 
    并在web.xml里配置之

    <?

    xml version="1.0" encoding="UTF-8"?

    > <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_3_0.xsd" version="3.0"> <display-name>Web Application Tomcat 7 Servlet 3.0 JSP 2.2</display-name> <description>Web Application Tomcat 7 Servlet 3.0 JSP 2.2</description> <servlet> <servlet-name>NoneAnnotationServlet</servlet-name> <servlet-class>NoneAnnotationServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>NoneAnnotationServlet</servlet-name> <url-pattern>/NoneAnnotationServlet</url-pattern> </servlet-mapping> </web-app>

    编译、部署后,都能够正常工作。

    蒽哪。非常和谐的说。Tomcat还有非常多新的Servlet 3.0与Java EE 6规范的特性,慢慢測试之。

    框中的内容出自:http://www.oschina.net/question/12_9194

    在刚開始照着书中的样例写时,因为书中的样例没有继承GenericServlet或HttpServlet。所以一直执行不起来,不完整的程序例如以下:

    <pre name="code" class="java">package self.servlet.a;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.GenericServlet;
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    
    
    //declaring a Servlet application with 
    //@WebServlet(name = "MyServlet",urlPatterns={"/my"})
    @WebServlet(name="MyServlet",urlPatterns = {"/my"})
    public class MyServlet {
    	
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 1L;
    	//declaring variable
    	transient ServletConfig servletConfig;
    	
    	public void init(ServletConfig servletConfig)
    					throws ServletException {
    		this.servletConfig = servletConfig;
    	}
    	
    	public ServletConfig getServletConfig(){
    		return this.servletConfig;
    	}
    	
    	public String getServletInfo(){
    		return "MyServlet!";
    	}
    	
    	public void service(ServletRequest request,
    			ServletResponse response) throws
    			ServletException,IOException {
    		String servletName = this.servletConfig.getServletName();
    		response.setContentType("text/html");
    		PrintWriter write = response.getWriter();
    		write.print("<html><head></head>"+"<body>Hello,"+servletName+"</body>"+"</html>");
    	}
    	
    	
    	public void destroy(){
    		
    	}
    	
    }
    
    

    <span style="font-size:18px;">执行时,程序一直报<span style="color:#ff0000;">Http:404错误。</span></span>
    </pre><pre name="code" class="java"><span style="font-size:18px;">直到把MyServlet写上继承类:GenericServlet,才干够执行成功。</span>
    </pre><pre name="code" class="java"><span style="font-size:18px;">这就是开头在说的:<span style="color:#333300;">全部servlet程序都是Servlet的子类。敲代码时,都要写上继承了某个Servlet父类。</span></span>


    
    

  • 相关阅读:
    Android开发:系统自动实现开机启动
    Android高手进阶教程【转】
    android 各种控件颜色值
    Android开发博客国内最大的移动开发博客eoe移动开发者社区
    异步图片加载工具类
    Android中shape的使用
    Android的asset/res资源框架结构
    winddows 运行指令 (2)
    使用activeMQ实现jms
    ActiveMQ在C#中的应用
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/6792958.html
Copyright © 2011-2022 走看看