@duyao
2015-05-03T04:18:25.000000Z
字数 5561
阅读 1416
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
和MyInit2
servlet2个,其中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
会发送
该对象适用于读取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>");
}