文章目录
Servlet应用开发接口
servlet的构造方法会创建一个空的项目,
想要完成实例化还要init()方法进行初始化
getServletConfig返回初始化的信息
.
Servlet服务器不会轻易销毁,生命周期只会初始化,实例化一次。
service()方法会执行多次。容易同此数据多次读取,线程不安全。
解决方法是多用本地数据,
Servlet的生命周期
实例化 - 初始化 - service - 销毁
servlet不太安全,数据保护性能不好,多用局部变量改变。
servlet实例化时间
servlet对int方法的调用
参数是服务器自动生成的
servlet销毁时间
第三种举例:超负荷工作。
servlet的生命周期
servlet生命周期总结
Servlet应用进阶
context是全局对象,解决了多个servlet之间的数据不同步问题
<context-param>
<param-name>num3</param-name>
<param-value>num3Value</param-value>
</context-param>
<context-param>
<param-name>num4</param-name>
<param-value>num4Value</param-value>
</context-param>
<servlet>
<servlet-name>FakeName2</servlet-name>
<servlet-class>net.lww.ServletA</servlet-class>
<!-- servletConfig初始化参数,可以这样设置,也可以注解设置-->
<init-param>
<param-name>num1</param-name>
<param-value>num1value</param-value>
</init-param>
<init-param>
<param-name>num2</param-name>
<param-value>num2value</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>FakeName2</servlet-name>
<url-pattern>/myServlet</url-pattern>
</servlet-mapping>
public class ServletA extends HttpServlet {
// private ServletConfig myConfig;
private static final long serialVersionUID = 1L;
// @Override
// //为了全局调用,上面私有属性config
// public void init(ServletConfig config) throws ServletException {
// //第一种获取servletConfig对象参数方法
// this.myConfig=config;
// //服务器config传递给私有属性config
// }
public ServletA() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//第二种获得servletConfig方法
ServletConfig myConfig=getServletConfig();
//获取servletConfig初始化参数
String string1=myConfig.getInitParameter("num1");
String string2=myConfig.getInitParameter("num2");
//获取servletContext对象
ServletContext myContext=myConfig.getServletContext();//this.getServletContext();都可以
//获取全局初始化参数
String string3=myContext.getInitParameter("num3");
String string4=myContext.getInitParameter("num4");
//获取servletContext中的所有参数
Enumeration<String> string5=myContext.getInitParameterNames();
//便利枚举类型
while(string5.hasMoreElements()) {
//得到当前参数的参数与数值
String string6Name=string5.nextElement();
String string6Value=myContext.getInitParameter(string6Name);
//打印
PrintWriter writer1=response.getWriter();
writer1.write(string6Name+"="+string6Value);
writer1.write("</br>");
}
//显示数据(num1-num4)
PrintWriter writer=response.getWriter();
writer.write(string1);
writer.write("</br>");
writer.write(string2);
writer.write("</br>");
writer.write(string3);
writer.write("</br>");
writer.write(string4);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
ServletContext全局数据同步
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;
}
}
所有线程共享一份属性
web.xml与@WebServlet注解
注解配置Servlet,一旦注解配置就不能通过xml配置了
需要什么加什么,不用的删掉就好
WebServlet("/ServletC") 注解配置,参数是虚拟路径
@WebServlet(
name="servlet3", //别名
urlPatterns = "/ServletC", //虚拟路径
loadOnStartup = 1, //何时加载
initParams = { //初始化参数
@WebInitParam(name="p1",value="p1value"),
@WebInitParam(name="p2",value="p2value")
}
)