初始化声明研究
init方法
有参的init方法
public void init(ServletConfig config) throws ServletException
无参的init方法
public void init() throws ServletException
执行特点
servlet中既有有参的又有无参的init方法,默认执行有参的,无参的就无效了;
若要执行无参的init方法,就把有参的方法删掉;
不处理任何请求
只复写init方法不复写doPost、doGet方法,也不配置<servlet-mapping>,servlet就不接受用户的请求;
但必须要配置<load-on-startup>,如果不配置,servlet只能在用户第一次访问组件时才能创建,但servlet又不接收用户的请求,所以不能创建出servlet对象;
初始化参数的获取
创建两个config对象:
一个Config是实现了ServletConfig接口的类的对象,用来收集web.xml中servlet组件配置信息的初始化参数;
一个Config是实现FilterConfig接口的类的对象,用来收集web.xml中filter组件配置信息的初始化参数;
tomcat读取web.xml文件,通过读取servlet组件的<init-param>标签中的初始化参数,把初始化参数封装到config里面:
key=username,value=scott
key=password,value=tiger
key=DBDRIVER,value=oracle.jdbc.driver.OracleDriver
通过<servlet-class>找到字节码文件创建出servlet对象;
创建完servlet对象就执行有参的init方法,并把(实现了ServletConfig接口的类的)config对象注入给init方法;
在init方法里获取servlet初始化参数 config.getInitParameter("username");
传递初始化参数,把值赋给实例全局变量就可以传递给该类的其他方法;
直接使用实例全局变量就可以获取config里的初始化参数,并传递给业务层及持久层;
浏览器发送get请求,调用doget()方法并通过该方法获取到config对象,然后对请求进行分发处理;
注:初始化参数的读取不会线程不安全,因为没有对config的数据做任何敏感操作,一直是可重复读,因此是线程安全的(但final类型的不行,因为要显示的初始化,且不能再更改);
初始化参数的方法可以通过修改配置信息使持久层访问相应的数据库,体现拥抱需求的思想;
由于web.xml的配置一旦出错,就可能造成整个项目启动失败,所以推荐使用properties文件,直接通过读取文件修改持久层访问相应的数据库;
映射名
映射名的命名
tomcat会把请求中项目名后的所有内容作为映射名;所以在命名映射名的时候要把servlet组件的路径也加进去;
如:请求127.0.0.1:8080/test/servlet/formServlet
配置<url-pattern>/servlet/formServlet</url-pattern>
tomcat还会把访问servlet的映射名的路径作为访问视图组件的默认路径;
从哪个路径发送的请求,转向哪个路径的组件;
<servlet>
<servlet-name>form</servlet-name>
<servlet-class>cn.cx.servlet.FormServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>form</servlet-name>
<url-pattern>/a/formServlet1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>form</servlet-name>
<url-pattern>/b/formServlet1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>form</servlet-name>
<url-pattern>/c/formServlet1</url-pattern>
</servlet-mapping>
代码的优化
实例
<form action="formServlet1.do" method="post">
用户名:<input type="text" name="uname">
<input type="submit" value="提交">
</form>
<servlet>
<servlet-name>form</servlet-name>
<servlet-class>cn.cx.servlet.FormServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>form</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
*.do作用
匹配所有用户在所有路径下的请求,大量节省配置文件;
tomcat依旧会找到发请求的起始路径,非常智能;
依赖查找
Session:依赖request才能取得session
HttpSession session = req.getSession();
Application:依赖request
推荐方法:
ServletContext app = req.getSession().getServletContext() ; // 代码之间没有耦合性
Out 不常用;
El(Expression Language)表达式
概念
属于视图层技术,只能在jsp页面中使用,作用:取得内置对象的数据,并进行处理,自动的把处理结果通过response发回浏览器显示;
配置
Tomcat4以上都有效,如不能显示就加一条语句:<%@ page isELIgnored="false"%>
语法
${表达式}
不可以加引号,也不可以加分号
使用
基本使用:健壮性特别好,会把null变成空串输出;
查找顺序:page--->request--->session--->application
若不想按查找顺序来,可以用隐式对象:${requestScope.name}
调用request中对象相应的方法,取得属性名所指的属性值,由于对象被隐藏,无法看见,我们并不知道调用的是那个对象;
处理
可以进行相应的运算:自动把字符串转换成整型,空串转换成0输出;
可以从集合和数组中获取数据,还能对集合和数组是否为空进行判断;
在MVC模式中对结果数据渲染;
实例
<%
pageContext.setAttribute("a","30") ;
request.setAttribute("b",5);
%>
<h1><%=request.getAttribute("c")%></h1><br>
<h1>---c=${c}---</h1><br>
<h1>---a*b+c+6=${a*b+c+6}---</h1><br>
<h1>---a>b=${a>b}---</h1><br>
<h1>---3+5*2=${3+5*2}---</h1><br>
==================================eldemo04.jsp================================
<%@page import="cn.mldn.lxh.servlet.el.*"%>
<%
if(request.getAttribute("sim")!=null)
{
Simple s = (Simple)request.getAttribute("sim") ;
%>
<h1><%=s.getName()%></h1>
<%
}
%>
<h1>${sim.name}</h1>
如果el表达式从scope里取出的属性名为"sim1"的属性值为null,就不再管后面的数据,直接输出空串