目录
Servlet解决单线程的方式 实现接口SingleThreadModel
Servlet写helloworld
编写第一个项目
在webapps 创建test项目
WEB-INF/classes
FirstServlet.java
package cn.cast;
import java.io.*;
import javax.servlet.*;
public class FirstServlet extends GenericServlet{
public void service(ServletRequest req,ServletResponse res)throws ServletException,IOException{
OutputStream out = res.getOutputStream();
out.write("hello servlet".getBytes());
}
}
编译 javac –d . FirstServlet.java 报错 将tomcat 下面的servlet包加入系统环境变量 D:\tomcat-8.0.35\apache-tomcat-8.0.35\lib\servlet-api.jar 加入classpath
重新执行编译成功
在WEB-INF下web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>cn. cast.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/FirstServlet</url-pattern>
</servlet-mapping>
</web-app>
重启服务器 访问:http://localhost:8080/test/FirstServlet 出现hello servlet
servlet流程图
Myeclipse创建web项目
选择no 使用java225.0 然后使用6.0的编译器:
将需要的jar包放到lib目录并且导入:
创建servlet 继承GenericServlet
package cn.cast;
import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class ServletDemo extends GenericServlet {
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
res.getOutputStream().write("hello servlet!!!!!!!!!".getBytes());
}
}
在web.xml中配置对外访问路径:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>servletdemo1</servlet-name>
<servlet-class>cn.cast.ServletDemo</servlet-class>
</servlet>
<servlet>
<servlet-name>ServletDemo2</servlet-name>
<servlet-class>cn.cast.ServletDemo2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servletdemo1</servlet-name>
<url-pattern>/servletdemo1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ServletDemo2</servlet-name>
<url-pattern>/servlet/ServletDemo2</url-pattern>
</servlet-mapping>
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
发布项目
集成tomcat
Windows ---preferences---myeclipse----servers ----tomcat
选择tomcat版本并选择路径 设置为enabled 启用 (tomcat可设置jdk的版本号 默认不修改 启动模式为debug模式)
将项目发布到服务器 并启动tomcat
访问
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
官方文档:
http://tomcat.apache.org/tomcat-5.5-doc/servletapi/index.html
httpservlet
http://tomcat.apache.org/tomcat-5.5-doc/servletapi/index.html
新建一个servlet myeclispse 可之间创建并且在web.xml中配置访问路径
package cn.cast;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletDemo2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.getOutputStream().write("hello httpservlet!!!".getBytes());
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);//不管是post還是get方法都由doGet方法處理。
}
}
重启tomcat
访问:http://localhost:8080/web1/ServletDemo2
@@@@@@@@@@@@@@@@@@@@@@
服务器自动加载web.xml 更改了web.xml文件中的内容时候,不需要重启服务。
验证服务器智慧创建一次servlet
新建servletDemo3
package cn.cast;
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 ServletDemo3 extends HttpServlet {
@Override
public void destroy() {
// TODO Auto-generated method stub
super.destroy();
System.out.println("destroy!");
}
@Override
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
super.init(config);
System.out.println("init");
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
在浏览器访问http://localhost:8080/web1/servlet/ServletDemo3
在控制台显示init 多次访问也只显示一次。
缺省的servlet默认不配置,
servlet线程安全
Servlet如果操作了共享资源,需要注意线程安全的问题。
package cn.cast;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletDemo4 extends HttpServlet {
/**
线程安全
*/
//放在外面线程不安全。
int i=0;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//变量放在里面线程是安全的
//int i=0;
//在实际web资源访问中是不可行的,同事只能有一个连接访问,其他的连接等待。
synchronized (this) {
i++;
try {
Thread.sleep(1000*10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
response.getOutputStream().write((i+"").getBytes());
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
Servlet解决单线程的方式 实现接口SingleThreadModel
方法是当一个请求没有访问没有完毕后,创建一个新的servlet来响应新的请求。
package cn.cast;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.SingleThreadModel;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletDemo4 extends HttpServlet implements SingleThreadModel{
int i=0;
//子类在覆盖父类的方法时,不能抛出比父类更多的异常。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
i++;
try {
Thread.sleep(1000*4);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
response.getOutputStream().write((i+"").getBytes());
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
servletconfig对象
Servletconfig用于封装servlet的配置信息,应用场景 :
在配置数据库连接 字符集等 配置文件等,不适合在程序中写死方便切换的数据。
Web.xml
<servlet>
<servlet-name>ServletDemo5</servlet-name>
<servlet-class>cn.cast.ServletDemo5</servlet-class>
<init-param>
<param-name>data</param-name>
<param-value>xxx</param-value>
</init-param>
<init-param>
<param-name>data2</param-name>
<param-value>yyy</param-value>
</init-param>
<init-param>
<param-name>data3</param-name>
<param-value>zzz</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo5</servlet-name>
<url-pattern>/servlet/ServletDemo5</url-pattern>
</servlet-mapping>Servlet对象
package cn.cast;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
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 ServletDemo5 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletConfig config = this.getServletConfig();
//得到指定的 参数
String value = config.getInitParameter("data");
System.out.println(value);
//得到所有的参数
Enumeration e = config.getInitParameterNames();
while (e.hasMoreElements()){
String name = (String) e.nextElement();
String value1 = config.getInitParameter(name);
System.out.println(value1);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
访问在控制台输出 xxx
servletcontext对象
ServletDemo6 存入数据
package cn.cast;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//servletcontext实例
public class ServletDemo6 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//得到servletcontext方式一
ServletContext context = this.getServletConfig().getServletContext();
//得到servletcontext方式二
context = this.getServletContext();
context.setAttribute("data", "xxx");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
ServletDemo6 读取数据
package cn.cast;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletDemo5 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*ServletConfig config = this.getServletConfig();
String value = config.getInitParameter("data");
System.out.println(value);*/
ServletContext context = this.getServletContext();
String value = (String) context.getAttribute("data");
System.out.println(value);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
应用场景:多个servlet项目之间实现数据共享。可以应用在聊天室。
Servletcontext
- 这是一个容器
- Servletcontext域说明了这个容器范围,也就是应用程序范围。