servlet web應用基礎(2)
目錄
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域說明了這個容器範圍,也就是應用程式範圍。