Servlet應用開發接口
Servlet服務器不會輕易銷燬,生命週期只會初始化,實例化一次。
service()方法會執行多次。容易同此數據多次讀取,線程不安全。
解決方法是多用本地數據,
Servlet的生命週期
參數是服務器自動生成的
第三種舉例:超負荷工作。
Servlet應用進階
context是全局對象,解決了多個servlet之間的數據不同步問題
<!-- 配置全局的初始化參數,任意servlet都可以訪問-->
<context-param>
<param-name>ContextParam1</param-name>
<param-value>ContextParam1Value</param-value>
</context-param>
<context-param>
<param-name>ContextParam2</param-name>
<param-value>ContextParam2Value</param-value>
</context-param>
<!-- servlet別名 -->
<servlet>
<servlet-name>ServletA</servlet-name>
<servlet-class>net.lww.ServletA</servlet-class>
<!--配置servlet初始化參數-->
<init-param>
<param-name>ServletParam1</param-name>
<param-value>ServletParam1Value</param-value>
</init-param>
<init-param>
<param-name>ServletParam2</param-name>
<param-value>ServletParam2Value</param-value>
</init-param>
</servlet>
<!-- 虛擬路徑 -->
<servlet-mapping>
<servlet-name>ServletA</servlet-name>
<url-pattern>/ServletA</url-pattern>
</servlet-mapping>
ServletConfig
第一種ServletConfig方法,(一般不用)
第二種獲得ServletConfig方法,哪裏都能用
web.xml與@WebServlet註解
全局數據同步
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>Class_7</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
<welcome-file>ServletB</welcome-file>
</welcome-file-list>
<!-- 配置全局的初始化參數,任意servlet都可以訪問-->
<context-param>
<param-name>ContextParam1</param-name>
<param-value>ContextParam1Value</param-value>
</context-param>
<context-param>
<param-name>ContextParam2</param-name>
<param-value>ContextParam2Value</param-value>
</context-param>
<!-- servlet別名 -->
<servlet>
<servlet-name>ServletA</servlet-name>
<servlet-class>net.lww.ServletA</servlet-class>
<!--配置servlet初始化參數-->
<init-param>
<param-name>ServletParam1</param-name>
<param-value>ServletParam1Value</param-value>
</init-param>
<init-param>
<param-name>ServletParam2</param-name>
<param-value>ServletParam2Value</param-value>
</init-param>
</servlet>
<!-- 虛擬路徑 -->
<servlet-mapping>
<servlet-name>ServletA</servlet-name>
<url-pattern>/ServletA</url-pattern>
</servlet-mapping>
</web-app>
```java
package net.lww;
//@WebServlet("/ServletA")//註解方式配置
public class ServletA extends HttpServlet {
private static final long serialVersionUID = 1L;
// private ServletConfig config;//自定義ServletConfig--------------------------
/**
* @see HttpServlet#HttpServlet()
*/
public ServletA() {
super();
// TODO Auto-generated constructor stub
}
//------------------------
// @Override
// public void init(ServletConfig config) throws ServletException {
// // TODO Auto-generated method stub
// super.init(config);
// this.config=config;//----------------
// }
//
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//獲取ServletConfig對象
ServletConfig config=this.getServletConfig();
//獲取Servlet初始化參數,此處的config是局部的對象,就近原則
String param1=config.getInitParameter("ServletParam1");
String param2=config.getInitParameter("ServletParam2");
//獲取ServletContext對象。
ServletContext context=this.getServletContext();//config.getServletContext();
//獲取全局初始化參數
String contextParam1=context.getInitParameter("ContextParam1");
String contextParam2=context.getInitParameter("ContextParam2");
//在客戶端進行顯示
PrintWriter writer=response.getWriter();
writer.write("paran1=="+param1);
writer.write("<br/>");
writer.write("param2=="+param2);
writer.write("<br/>");
writer.write("ContextParam1=="+contextParam1);
writer.write("<br/>");
writer.write("ContextParam2=="+contextParam2);
writer.write("<br/>");
//顯示當前訪問次數
writer.write("次數是=="+getVisitCount());
writer.write("<br/>");
}
private int getVisitCount() {
//先判斷ServletContext中次數是否存在,不存在設置爲1
//獲取ServletContext對象
ServletContext context=this.getServletContext();
//獲取context中的參數num
Object obj=context.getAttribute("num");
//判斷
int num=0;
if(null==obj) {
num=1;
context.setAttribute("num",num);
}else {
//訪問次數轉化爲整形
num=Integer.parseInt(obj.toString());
++num;
context.setAttribute("num",num);
}
return num;
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
```java
package net.lww;
/**
* Servlet implementation class ServletB
*/
@WebServlet("/ServletB")
public class ServletB extends HttpServlet {
private static final long serialVersionUID = 1L;
public ServletB() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//獲取輸出流Writer對象
PrintWriter writer=response.getWriter();
//獲取ServletContext對象。
ServletContext context=this.getServletContext();//config.getServletContext();
//獲取Context對象中的所有參數
Enumeration<String> params = context.getInitParameterNames();
//遍歷枚舉類型
while(params.hasMoreElements()) {
//得到當前參數
String paramName=params.nextElement();
//得到當前參數的數值
String paramValue=context.getInitParameter(paramName);
//參數值進行顯示
writer.write(paramName+"="+paramValue);
writer.write("<br/>");
}
writer.write("<br/>");
//顯示當前訪問次數
writer.write("次數是=="+getVisitCount());
}
/*實現計數器的封裝方法
* 獲取訪問次數
* */
private int getVisitCount() {
//先判斷ServletContext中次數是否存在,不存在設置爲1
//獲取ServletContext對象
ServletContext context=this.getServletContext();
//獲取context中的參數num
Object obj=context.getAttribute("num");
//判斷
int num=0;
if(null==obj) {
num=1;
context.setAttribute("num",num);
}else {
//訪問次數轉化爲整形
num=Integer.parseInt(obj.toString());
++num;
context.setAttribute("num",num);
}
return num;
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
註解配置
package net.lww;
//@WebServlet("/ServletC")//註解配置,參數是虛擬路徑
@WebServlet(
urlPatterns = "/ServletC",
loadOnStartup = 1,
initParams = {
@WebInitParam(name="p1",value="p1value"),
@WebInitParam(name="p2",value="p2value")
}
)
//需要什麼加什麼,不用的刪掉就好
public class ServletC extends HttpServlet {
private static final long serialVersionUID = 1L;
public ServletC() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletConfig config=this.getServletConfig();
String p2=config.getInitParameter("p2");
response.getWriter().write("<br/>"+"p2= "+p2);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}