servlet生命周期:Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。
与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet
ServletConfig
ServletConfig对特定的Servlet的设置参数,一个servlet被实例化后,对任何客户端在任何时候访问有效,但仅对本servlet有效
在web.xml中设置参数
<servlet>
<servlet-name>ServletTest</servlet-name>
<servlet-class>junit.test.ServletTest</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>ljf</param-value>
</init-param>
</servlet>
在servlet中获取这些参数
ServletConfig sc=this.getServletConfig();
System.out.println(sc.getInitParameter("name"));
ServletContext
ServletContext接口定义了运行servlet的web应用的servlet视图。容器供应商负责提供servlet容器内ServletContext接口的实现。使用ServletContext对象,servlet可以记录事件日志,获取资源的URL地址,并且设置和保存上下文内可以访问的其他servlet的属性。
ServletContext以web的已知路径为根路径。比如,假定一个servlet上下文位于http://www.mycorp.com/catalog。以/catalog请求路径开头的所有请求,已知为上下文路径,被路由到和ServletContext关联的web应用。
容器中部署的每一个web应用都有一个ServletContext接口的实例对象与之关联。如果容器被分布在多个虚拟机上,一个web应用将在每一个VM中有一个ServletContext实例。
不作为web应用一部分部署的容器中的servlet默认是“默认”web应用的一部分,有一个默认的ServletContext。在分布式容器中。默认ServletContext是非分布式的,并且必须只存在于一个VM中。分布式容器中的上下文属性上下文属性对于创建它们的VM来说是本地的。这防止ServletContext属性存储于分布式容器的共享内存中。当信息需要在运行于分布式环境中的servlet之间共享时,信息被放入会话中,存储于数据库中,或者存储于EJB组件中。
ServletContext接口通过下列方法提供对web应用组成的静态内容文档层级的直接访问,包括HTML,GIF和JPEG文件:getResource和getResourceAsStream方法以“/”开头的字符串为参数,它指定上下文根路径的资源相对路径。文档的层级可能存在于服务器的文件系统,war文件,远程服务器或者在一些其它位置中。这些方法不用来获取动态内容。比如,在一个支持JSP规范1的容器中,getResource("/index.jsp")这种形式的方法调用将返回JSP源代码,而不是处理后的输出
在web.xml中设置 参数
<context-param>
<param-name>name</param-name>
<param-value>ljfbest</param-value>
</context-param>
在servlet中获取这些参数
ServletContext st=this.getServletContext();//获取web.xml中设置的servletcontext值
System.out.println(st.getInitParameter("name"));
st.setAttribute("arg", new Object());//往servletcontext中加入数据
st.getAttribute("arg");//获取加入的对象
RequestDispatcher rd=st.getRequestDispatcher("index.jsp");//实现servlet的转发
rd.forward(request, response);
读取资源文件:
a.读取资源文件 在servlet中
ServletContext sc=this.getServletContext();
//获取资源的绝对路径
String path=sc.getRealPath("/WEB-INF/classes/db.properties");
FileInputStream fs=new FileInputStream(path);
Properties pro=new Properties();
pro.load(fs);
//*************
InputStream is=sc.getResourceAsStream("/WEB-INF/classes/db.properties");//获取资源流,注意路径写法
pro.load(is);
String url=pro.getProperty("url");
String username=pro.getProperty("username");
String password=pro.getProperty("password");
System.out.println(url+" "+username+" "+password);
b.如果读取资源文件的程序不是servlet的话,就只能通过类装载器支读了
public static void main(String[] args) throws IOException {
//以下代码虽然可以读取资源文件数据,但是无法获取文件更新后数据
Properties pro=new Properties();
InputStream is=Real.class.getClassLoader().getResourceAsStream("db.properties");
pro.load(is);
System.out.println(pro.getProperty("url"));
//通过类加载获取资源的url文件,再通过传统方式读取资源文件的数据,这样可以读取到更新后的数据
String path=Real.class.getClassLoader().getResource("db.properties").getPath();
FileInputStream fs=new FileInputStream(path);
Properties pro1=new Properties();
pro1.load(fs);
System.out.println(pro.getProperty("url"));
JSP有哪些内置对象以及作用
JSP共有以下9种基本内置组件:
request 用户端请求,此请求会包含来自GET/POST请求的参数
response 网页传回用户端的回应
pageContext 网页的属性是在这里管理
session 与请求有关的会话期
application servlet正在执行的内容
out 用来传送回应的输出
config servlet的构架部件
page JSP网页本身
exception 针对错误网页,未捕捉的例外
过滤器:
如实现编码统一:
public class CharFilter implements Filter {
private String encoding;
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
arg0.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
encoding=arg0.getInitParameter("encoding");
if(encoding==null||"".equals(encoding.trim()))
encoding="UTF-8";
}
}
在web.xml中配置
<filter>
<filter-name>CharEncoding</filter-name>
<filter-class>com.shop.filter.CharFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在fitler获取session
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse respon = (HttpServletResponse)resp;
HttpSession session = req.getSession();
User u = (User)session.getAttribute("loginUser");
if(u==null) {
respon.sendRedirect(req.getContextPath()+"/loginInput.jsp");
return; //后面的内容不再执行
}
对与多个匹配的Filter,哪个先执行呢?
JSR中说明的是,按照多个匹配的Filter,是按照其在web.xml中配置的顺序 来执行的。所以这也就是,把自己的Filter或者其他的Filter(比如UrlRewrite的Filter)放在Struts的 DispatcherFilter的前面的原因。因为,它们需要在请求被Struts2框架处理之前,做一些前置的工作。
当Filter被调用,并且进入了Struts2的DispatcherFilter中 后,Struts2会按照在Action中配置的Interceptor Stack中的Interceptor的顺序,来调用Interceptor