@duyao
2015-05-03T04:18:25.000000Z
字数 5561
阅读 1471
servlet
a. 新建web project
形成如下的目录结构
b. 在src文件中建立包,建立serverlet文件MyWeb.java,然后进行开发
c. 完成工程要发布,现在myeclipse中添加tomcat,(config server图标—),然后工程要告诉tomcat,就是在tomcat目录中的webapps添加刚刚的工程,(deploy图标)
d. 启动tomcat
找到MyEclipse安装目录下的\Common\plugins文件夹,比如:D:\MyEclipse10\Common\plugins,然后找到com.genuitec.eclipse.wizards_9.0.0.me201108091322.jar这个jar文件,打开后,可以看到里面有一个templates文件夹,进入后,可以看到里面有一个Servlet.java文件
添加
this.doGet(request, response);response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();
一个已经被注册的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>
在对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>
在匹配的时候要参考几个标准:①匹配度高的优先②*.扩展名的级别最低
当servlet第一次被访问后,就被加载到内存中,以后该实例对各种请求服务。即单例模式。因为servlet是单例的,因此会出现线程安全的问题
如果不加通保护机制,则可能会出现问题,解决方法:
a. 如果一个变量需要多个用户共享,则访问该变量的时候使用同步机制
synchronized (this) {//临界区:访问临界变量的代码段}
b. 如果一个变量不需要共享,则在doGet()或doPost()中定义为成员变量
<load-on-startup>配置需求:当我们网站启动的时候,可能会初始化一些数据(比如创建临时表,定时完成的发送邮件,发送数据等)
解决方法:用<load-on-startup>和线程配合完成
该项目有MyInit1和MyInit2servlet2个,其中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 {@Overridepublic void run() {int i=0;// TODO Auto-generated method stubwhile(true){try {Thread.sleep(10*1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.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 hereSystem.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 hereSystem.out.println("i'm init2222");}}
完成后会看到后台先启动MyInit1再启动MyInit2,并且每隔10sMyInit1会发送
该对象适用于读取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>");}