servlet/jsp

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值