采用Jetty搭建简单的WebApplicationServer

来源:互联网 发布:禁止淘宝网页跳转到app 编辑:程序博客网 时间:2024/05/19 08:36

一、基本设置

希望采用Web的方式,远程对服务的配置进行管理,考虑到Jetty作为Web容器是纯JAVA写的,并且能够很好的与JAVA应用程序集成在一起使用,于是就采用它了。下面是对搭建Jetty应用的记录过程。

当前的Jetty版本为:jetty-6.1.14,在Eclipse新建一个工程名为Test,并新建包:test.jetty,然后从下载的Jetty包中的如此路径:jetty-6.1.14/examples/embedded/src/main/java/org/mortbay/jetty/example拷贝JAVA类OneWebApp.java到test.jetty包中,在Eclipse中打开并修改其包名为test.jetty,代码不用作任何修改,因为这已经是一个现成的WebServer了,源码如下:

package test.jetty;

 

import org.mortbay.jetty.Connector;

import org.mortbay.jetty.Server;

import org.mortbay.jetty.nio.SelectChannelConnector;

import org.mortbay.jetty.webapp.WebAppContext;

 

public class OneWebApp

{

    public static void main(String[] args)

        throws Exception

    {

        String jetty_default=new java.io.File("./start.jar").exists()?".":"../..";

        String jetty_home = System.getProperty("jetty.home",jetty_default);

 

        Server server = new Server();

       

        Connector connector=new SelectChannelConnector();

        connector.setPort(Integer.getInteger("jetty.port",8080).intValue());

        server.setConnectors(new Connector[]{connector});

       

        WebAppContext webapp = new WebAppContext();

        webapp.setContextPath("/");

        webapp.setWar(jetty_home+"/webapps/test");

        webapp.setDefaultsDescriptor(jetty_home+"/etc/webdefault.xml");

       

        server.setHandler(webapp);

       

        server.start();

        server.join();

    }

}

 

在工程Test所在路径下面新建目录lib,并将Jetty服务需要的最小JAR包拷贝到该目录,JAR包有:ant-1.6.5.jar、commons-logging-1.0.4.jar、core-3.1.1.jar、jetty-6.1.14.jar、jetty-util-6.1.14.jar、jsp-2.1.jar、jsp-api-2.1.jar、servlet-api-2.5-6.1.14.jar,并加入到ECLIPSE的CLASSPATH中。

这个时候,在Test目录下再新建etc、webapps两个目录,将解压打开的Jetty目录下etc目录下的webdefault.xml拷贝到新建的etc目录、将Jetty目录下webapps目录的test目录也拷贝到新建的webapps目录下。然后直接在Eclipse中,点右键在该类文件上,选择“Run as-->Java Application”,此时服务就已经启动起来了,打开浏览器,输入:http://localhost:8080,就可以看到如下页面了:

 

到此为止,一个简单的应用服务就搭建起来了,没有写一句代码,因为这些Jetty已经为我们考虑到了。

 

二、高级应用

1、编写Servlet

以上的设置只是满足了我们可以将一个静态页面拷贝到webapps的test目录下,并可以通过浏览器打开,但是还不能够处理我们在页面的输入框中输入一些东西,将其写入文件或者是数据等运算操作。

这个时候,我们要在当前应用的基础之上配置自己的Servlet,用以处理特定的业务,编写如下简单Servlet:

package test.servlet;

 

import java.io.IOException;

import java.util.Enumeration;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

/**

 * @author Fenglb

 * @version 1.0

 * 创建时间:2009-8-19 下午02:06:47

 * 类说明:Servlet

 */

public class MyServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request,

            HttpServletResponse response) throws ServletException, IOException {

        System.out.println("calling MyServlet");

        Enumeration e=request.getParameterNames();

        while(e.hasMoreElements()){

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

            String value=request.getParameter(name);

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

        }      

    }

    protected void doPost(HttpServletRequest request,

            HttpServletResponse response) throws ServletException, IOException {

        doGet(request,response);

    }

}

为了让该Servlet能够工作,我们需要将其配置在具体应用的/WEB-INF/web.xml文件中,如这里应该配置在“Test工程所在目录/webapps/test/WEB-INF/web.xml”文件中,在其中加入如下代码:

<!--配置一个Servlet类,并取名为httpprocesserservlet-->

  <servlet>

    <servlet-name>httpprocesserservlet</servlet-name>

    <servlet-class>

        test.servlet.MyServlet

    </servlet-class>

    <load-on-startup>2</load-on-startup>

  </servlet>

  <!--配置请求处理映射,就是前台通过什么样的路径请求通过这处理,这里就配置为前台页面中往后台提交时,

  form的action为"httpprocesserservlet"时,通过测试的Servlet处理-->

  <servlet-mapping>

    <servlet-name>httpprocesserservlet</servlet-name>

    <url-pattern>/httpprocesserservlet</url-pattern>

  </servlet-mapping>

新建一个HTML页面,名称随意,内容如下,不过form的action一定要为"httpprocesserservlet":

<%@ page contentType="text/html; charset=gbk" %>

<HTML>

  <HEAD>

    <TITLE>MyServlet Test</TITLE>

    <META http-equiv="Pragma" content="no-cache">

    <META http-equiv="Cache-Control" content="no-cache,no-store">

  </HEAD>

<BODY>

       <form action="/httpprocesserservlet" method="post" name="form1">

              <table>

                     <tr>

                            <td><input type="text" name="mytext" size="20">

                            </td>

                            <td>

                                   <input type="submit" name="mysub" value="提交">

                            </td>

                     </tr>

              </table>

       </form>

</BODY>

</HTML>

我就将该页面放于test应用的根目录下,并命名为"myservlet.html",在浏览器中打入:http://localhost:8080/myservlet.html,就可以看到该页面如下:

 

 

随意在框中输入内容,就可以在后台看到有输出,这表示配置正确了。

2、编写过滤器

但是这个时候你会发现一个问题,递交到后台的中文全部是乱码,这个为了处理乱码的问题,我们就需要为其设置编码,最好的方式就是编写过滤器了,如下代码:

package test.servlet;

 

import java.io.IOException;

 

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletRequest;

/**

 * @author Fenglb

 * @version 1.0

 * 创建时间:2009-8-20 上午09:23:29

 * 类说明:过滤器

 */

public class MyFilter implements Filter{

 

    public void destroy() {

        // TODO Auto-generated method stub

       

    }

 

    public void doFilter(ServletRequest srequest, ServletResponse sresponse, FilterChain chain) throws IOException, ServletException {

        System.out.println("Calling MyFilter");

        HttpServletRequest request = (HttpServletRequest) srequest;

        request.setCharacterEncoding("GBK");

        chain.doFilter(srequest, sresponse);

    }

 

    public void init(FilterConfig arg0) throws ServletException {

        // TODO Auto-generated method stub

       

    }

 

}

将该过滤器也配置在web.xml中,做如下配置:

<filter>

       <filter-name>EncodingFilter</filter-name>

       <filter-class>test.servlet.MyFilter</filter-class>

  </filter>

  <filter-mapping>

       <filter-name>EncodingFilter</filter-name>

       <url-pattern>/*</url-pattern>

  </filter-mapping>

到此为止,基本的框框架架都有了,要做什么样的具体应用就可以在此上面进行扩展操作了。

0 0
原创粉丝点击