[关闭]
@duyao 2015-05-03T04:18:25.000000Z 字数 5561 阅读 1361

使用工具开发servlet

servlet


1. 使用MyEclipse开发

步骤

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

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

2. 修改servlet配置模板

找到MyEclipse安装目录下的\Common\plugins文件夹,比如:D:\MyEclipse10\Common\plugins,然后找到com.genuitec.eclipse.wizards_9.0.0.me201108091322.jar这个jar文件,打开后,可以看到里面有一个templates文件夹,进入后,可以看到里面有一个Servlet.java文件
添加

  1. this.doGet(request, response);
  2. response.setContentType("text/html;charset=utf-8");
  3. PrintWriter out = response.getWriter();

3. servlet细节问题

1. 多次注册

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

  1. <servlet>
  2. <!-- 一般都是servlet文件名 -->
  3. <servlet-name>MyWeb</servlet-name>
  4. <!-- class是包名+类名 -->
  5. <servlet-class>com.web.MyWeb</servlet-class>
  6. </servlet>
  7. <!-- 可以有多个mapping映射,
  8. 即访问 http://localhost:8080/myFirstWeb/hello
  9. 和访问http://localhost:8080/myFirstWeb/MyWeb
  10. -->
  11. <servlet-mapping>
  12. <!-- 和上面的name相同 -->
  13. <servlet-name>MyWeb</servlet-name>
  14. <!-- url是访问时的资源名 -->
  15. <url-pattern>/MyWeb</url-pattern>
  16. </servlet-mapping>
  17. <servlet-mapping>
  18. <servlet-name>MyWeb</servlet-name>
  19. <url-pattern>/hello</url-pattern>
  20. </servlet-mapping>
2. 通配符映射

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

  1. <servlet-mapping>
  2. <servlet-name>MyWeb</servlet-name>
  3. <url-pattern>*.html</url-pattern>
  4. </servlet-mapping>
  5. <servlet-mapping>
  6. <servlet-name>MyWeb</servlet-name>
  7. <url-pattern>/*</url-pattern>
  8. </servlet-mapping>

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

3. servelte的单例问题

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

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

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

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

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

  1. <servlet>
  2. <servlet-name>MyInit1</servlet-name>
  3. <servlet-class>com.web.MyInit1</servlet-class>
  4. <!-- 这里的数字表示启动顺序,此时有多个servlet,init1先启动 -->
  5. <load-on-startup>1</load-on-startup>
  6. </servlet>
  7. <servlet>
  8. <servlet-name>MyInit2</servlet-name>
  9. <servlet-class>com.web.MyInit2</servlet-class>
  10. <!-- 这里的数字表示启动顺序,此时有多个servlet,init2第2个启动 -->
  11. <load-on-startup>2</load-on-startup>
  12. </servlet>

MySendThread发送线程

  1. package com.web.thread;
  2. public class MySendThread extends Thread {
  3. @Override
  4. public void run() {
  5. int i=0;
  6. // TODO Auto-generated method stub
  7. while(true){
  8. try {
  9. Thread.sleep(10*1000);
  10. } catch (InterruptedException e) {
  11. // TODO Auto-generated catch block
  12. e.printStackTrace();
  13. }
  14. System.out.println("发送"+(++i)+"次");
  15. }
  16. }
  17. }

MyInit1

  1. package com.web;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.http.HttpServlet;
  4. import com.web.thread.MySendThread;
  5. public class MyInit1 extends HttpServlet {
  6. /**
  7. * Constructor of the object.
  8. */
  9. public MyInit1() {
  10. super();
  11. }
  12. /**
  13. * Destruction of the servlet. <br>
  14. */
  15. public void destroy() {
  16. super.destroy(); // Just puts "destroy" string in log
  17. // Put your code here
  18. }
  19. /**
  20. * Initialization of the servlet. <br>
  21. *
  22. * @throws ServletException if an error occurs
  23. */
  24. public void init() throws ServletException {
  25. // Put your code here
  26. System.out.println("i'm init1111");
  27. MySendThread mySendThread=new MySendThread();
  28. mySendThread.start();
  29. }
  30. }

MyInit2

  1. package com.web;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.http.HttpServlet;
  4. public class MyInit2 extends HttpServlet {
  5. /**
  6. * Constructor of the object.
  7. */
  8. public MyInit2() {
  9. super();
  10. }
  11. /**
  12. * Destruction of the servlet. <br>
  13. */
  14. public void destroy() {
  15. super.destroy(); // Just puts "destroy" string in log
  16. // Put your code here
  17. }
  18. /**
  19. * Initialization of the servlet. <br>
  20. *
  21. * @throws ServletException if an error occurs
  22. */
  23. public void init() throws ServletException {
  24. // Put your code here
  25. System.out.println("i'm init2222");
  26. }
  27. }

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

5. SverletConfig对象

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

  1. <servlet>
  2. <servlet-name>MyServletConfig</servlet-name>
  3. <servlet-class>com.web.MyServletConfig</servlet-class>
  4. <!-- 这里设置servlet配置信息,且只能被该servlet读取 -->
  5. <init-param>
  6. <param-name>encoding</param-name>
  7. <param-value>utf-8</param-value>
  8. </init-param>
  9. </servlet>
  10. <!-- 在servlet外面使用context-param配置信息,所有的servlet都可以使用 -->
  11. <context-param>
  12. <param-name>encoding</param-name>
  13. <param-value>utf-8</param-value>
  14. </context-param>

MyServletConfig.java

  1. package com.web;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import javax.servlet.ServletConfig;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. public class MyServletConfig extends HttpServlet {
  10. public void doGet(HttpServletRequest request, HttpServletResponse response)
  11. throws ServletException, IOException {
  12. //必须先setContentType,之后设置setCharacterEncoding才生效
  13. response.setContentType("text/html");
  14. String encoding=this.getServletConfig().getInitParameter("encoding");
  15. response.setCharacterEncoding(encoding);
  16. PrintWriter out=response.getWriter();
  17. out.println("编码方式是"+encoding);
  18. }
  19. public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
  20. this.doGet(request, response);
  21. }
  22. }

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

  1. <init-param>
  2. <param-name>encoding</param-name>
  3. <param-value>utf-8</param-value>
  4. </init-param>
  5. <init-param>
  6. <param-name>aur</param-name>
  7. <param-value>dy</param-value>
  8. </init-param>
  9. <init-param>
  10. <param-name>weather</param-name>
  11. <param-value>sunny</param-value>
  12. </init-param>

MyServletConfig.javad的doGet()函数

  1. //多个配置信息
  2. Enumeration<String> names=this.getInitParameterNames();
  3. while (names.hasMoreElements()) {
  4. String setString = (String) names.nextElement();
  5. String valueString=this.getInitParameter(setString);
  6. PrintWriter out=response.getWriter();
  7. out.println("name is "+setString+",value is "+valueString+"</br>");
  8. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注