MyEclipse开发servlet

1. 使用MyEclipse开发

步骤:

a. 新建web project
形成如下的目录结构

  • example
    • src(源代码,java文件放在这里)
    • jre system library
    • j2ee 1.4 library
    • WebRoot
      • META-INF
      • WEB-INF
        • LIB
        • WEB.XML
      • index.jsp

b. 在src文件中建立包,建立serverlet文件MyWeb.java,然后进行开发
c. 完成工程要发布,现在myeclipse中添加tomcat,(config server图标—),然后工程要告诉tomcat,就是在tomcat目录中的webapps添加刚刚的工程,(deploy图标)
d. 启动tomcat

2. 修改servlet配置模板

网上搜索修改模板

3. servlet细节问题

1. 多次注册

一个已经被注册的servlet可以被多次注册,即同一个servlet可以映射多个url

<servlet>
<!-- 一般都是servlet文件名 -->
<servlet-name>MyWeb</servlet-name>
<!-- class是包名+类名 -->
<servlet-class>com.web.MyWeb</servlet-class>
</servlet>
<!-- 可以有多个mapping映射,
即访问 http://localhost:8080/myFirstWeb/hello
和访问http://localhost:8080/myFirstWeb/MyWeb
-->
<servlet-mapping>
<!-- 和上面的name相同 -->
<servlet-name>MyWeb</servlet-name>
<!-- url是访问时的资源名 -->
<url-pattern>/MyWeb</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>MyWeb</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
2. 通配符映射

在对servlet映射时,可以使用通配符,有2种格式:
a. *.扩展名
b. 以/开头,以/*结尾

<servlet-mapping>
<servlet-name>MyWeb</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<servlet-mapping>
  <servlet-name>MyWeb</servlet-name>
  <url-pattern>/*</url-pattern>
</servlet-mapping>

在匹配的时候要参考几个标准:①匹配度高的优先②*.扩展名的级别最低

3. servelte的单例问题

当servlet第一次被访问后,就被加载到内存中,以后该实例对各种请求服务。即单例模式。因为servlet是单例的,因此会出现线程安全的问题
如果不加通保护机制,则可能会出现问题,解决方法:
a. 如果一个变量需要多个用户共享,则访问该变量的时候使用同步机制

synchronized (this) {
        //临界区:访问临界变量的代码段
    }

b. 如果一个变量不需要共享,则在doGet()doPost()中定义为成员变量

4. servelte的<load-on-startup>配置

需求:当我们网站启动的时候,可能会初始化一些数据(比如创建临时表,定时完成的发送邮件,发送数据等)
解决方法:用<load-on-startup>和线程配合完成
该项目有MyInit1MyInit2servlet2个,其中MyInit1完成每隔10s发送的任务
web.xml

<servlet>
<servlet-name>MyInit1</servlet-name>
<servlet-class>com.web.MyInit1</servlet-class>
 <!-- 这里的数字表示启动顺序,此时有多个servlet,init1先启动 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
    <servlet-name>MyInit2</servlet-name>
    <servlet-class>com.web.MyInit2</servlet-class>
      <!-- 这里的数字表示启动顺序,此时有多个servlet,init2第2个启动 -->
    <load-on-startup>2</load-on-startup>
</servlet>

MySendThread发送线程

package com.web.thread;
public class MySendThread extends Thread {
    @Override
    public void run() {
        int i=0;
        // TODO Auto-generated method stub
        while(true){
            try {
                Thread.sleep(10*1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("发送"+(++i)+"次");
        }
    }

}

MyInit1

package com.web;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import com.web.thread.MySendThread;

public class MyInit1 extends HttpServlet {

/**
 * Constructor of the object.
 */
    public MyInit1() {
        super();
    }

/**
 * Destruction of the servlet. <br>
 */
    public void destroy() {
        super.destroy(); // Just puts "destroy" string in log
        // Put your code here
    }

/**
 * Initialization of the servlet. <br>
 *
 * @throws ServletException if an error occurs
 */
    public void init() throws ServletException {
        // Put your code here
        System.out.println("i'm init1111");
        MySendThread mySendThread=new MySendThread();
        mySendThread.start();
    }
}

MyInit2

package com.web;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

public class MyInit2 extends HttpServlet {

/**
 * Constructor of the object.
 */
    public MyInit2() {
        super();
    }

/**
 * Destruction of the servlet. <br>
 */
    public void destroy() {
        super.destroy(); // Just puts "destroy" string in log
        // Put your code here
    }

/**
 * Initialization of the servlet. <br>
 *
 * @throws ServletException if an error occurs
 */
    public void init() throws ServletException {
        // Put your code here
        System.out.println("i'm init2222");
    }
}

完成后会看到后台先启动MyInit1再启动MyInit2,并且每隔10sMyInit1会发送

5. SverletConfig对象

该对象适用于读取servlet的配置信息
web.xml

<servlet>
    <servlet-name>MyServletConfig</servlet-name>
    <servlet-class>com.web.MyServletConfig</servlet-class>
    <!-- 这里设置servlet配置信息,且只能被该servlet读取 -->
    <init-param>
        <param-name>encoding</param-name>
        <param-value>utf-8</param-value>
    </init-param>
</servlet>

<!-- 在servlet外面使用context-param配置信息,所有的servlet都可以使用 -->
<context-param>
    <param-name>encoding</param-name>
    <param-value>utf-8</param-value>
</context-param>

MyServletConfig.java

package com.web;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyServletConfig extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //必须先setContentType,之后设置setCharacterEncoding才生效
        response.setContentType("text/html");
        String encoding=this.getServletConfig().getInitParameter("encoding");
        response.setCharacterEncoding(encoding);
        PrintWriter out=response.getWriter();
        out.println("编码方式是"+encoding);
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
                this.doGet(request, response);
    }

}

当配置信息是多个时,
web.xml

<init-param>
    <param-name>encoding</param-name>
    <param-value>utf-8</param-value>
</init-param>
<init-param>
    <param-name>aur</param-name>
    <param-value>dy</param-value>   
</init-param>
<init-param>
    <param-name>weather</param-name>
    <param-value>sunny</param-value>
</init-param>

MyServletConfig.javad的doGet()函数

//多个配置信息
Enumeration<String> names=this.getInitParameterNames();
while (names.hasMoreElements()) {
    String setString = (String) names.nextElement();
    String valueString=this.getInitParameter(setString);
    PrintWriter out=response.getWriter();
    out.println("name is "+setString+",value is "+valueString+"</br>");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值