jsp归纳
原创目录
jsp:include和 <%@ include%> 有什么不同
<%! int a=2; %>和 <% int a=2; %>的区别
jsp:include和 <%@ include%> 有什么不同
<jsp:include>
和 <%@ include%>
有什么不同
前者是动态包含,后者是静态包含,前者在包含jsp的时候会生成两个servlet,因为要使用request和response来进行通信。而后者在包含jsp的时候会生成一个servlet,下面题目明显有问题,并无说明是哪个include,应该是d
下面这个题目我实在看不出来a和b是哪里不一样,加不加空格都不影响。
jsp9大内置对象和四个作用域
下面四个都使用setAttribute和getAttribute来设置参数,下面四个就是四大作用域
pageContext 作用当前jsp页面,相当于同一个servlet(在老师的卷子上是page),但是这个真正的对象是pageContext
request 类似请求转发,可作用请求转发后的jsp页面
session 作用是一次会话(浏览器不关闭,就一直有用)
application 类似servletContext,作用在整个服务器上下文,除非服务器关闭或重启
page 这是个Object类型,但是在编辑成java文件的代码来看,这是指向当前jsp页面对应的java文件类
out 是JspWriter类型与 response.getWriter()
有明显区分,两者同时写在一个jsp文件中,无论写的顺序如何,优先显示后者的内容。
config 类型是servletConfig,用来获得与服务器有关的参数
exception 只能在设置了isErrorPage="True"的页面使用
response:是HttpServletResponse.
<%! int a=2; %>和 <% int a=2; %>的区别
<%! int a=2; %>
和 <% int a=2; %>
的区别
前者会在将jsp解析成java文件代码时,将int a=2放在类变量的位置进行定义。
后者则是在_jspService()方法内进行定义
所以前者在同一页面同一用户每次访问这个jsp代码时候,如果写上
这样的代码的话,会进行a的相加。
如果写成 <% int a=2; %>
则会永远输出3,因为访问这个jsp的时候,调用的是这个jsp实例的_jspService()方法,每次都定义过了int a=2;
同样,依据这个,我们可以得知,使用了 <%! %>
定义的java代码都会作为类的实例属性和类的实例方法,这样我们方法的 定义就只能使用 <%! %>
了。因为方法不能嵌套定义。同样, <%! %>
之中不能写不是定义的其它java代码。
jsp动作元素
还有
jsp指令
bean的作用范围(错题)
jsp元素(类似 <% %>
的有几种)
<%! %><%= %><%@ %><%-- --%><% %>
jsp动态包含和静态包含
上面是错的,
JSP中有两种包含:静态包含: <%@include file="被包含页面"%>
和动态包含: <jsp:include page="被包含页面"flush="true">
创建文件夹和文件
url重写
bean的释放
servlet知识点扫盲
servlet的三个生命周期:装载servlet,创建servlet实例,销毁servlet
还有四个生命周期的说法(我更偏向这种)
servlet工作的过程,我感觉写的非常好
首先使用的servlet是继承了HttpServlet这个类的,在servlet的生命周期中,调用其中的destroy()方法是在移除这个servlet时候执行的.说明一点,servlet中的init()方法只会在该servlet被第一次访问的时候调用,也就是说,第一次访问才被初始化实例。如果service()方法存在,也写了out.print()之类的语句,则会比doget()晚在浏览器页面上输出,这是会输出的。
另外,总结一下
Servlet的生命周期如下
1.实例化,Servlet容器创建Servlet创建Servlet实例,这里的容器就是指tomcat
2.初始化,该容器调用init()方法,完成加载servlet所需资源
3.处理请求,如果请求Servlet,则容器调用service方法,业务逻辑放在这里
4.销毁,销毁实例之前调用destroy()方法
Servlet的几个方法如下:
init()
getServletConfig()
service()
getServletInfo()
destory()
Servlet的web.xml中的一些配置信息的理解
abc com.jxust.Hello //需要注意的问题是这里需要加上包名,在同级目录下的!!
//当访问的是一个servlet的一个项目的时候,会先找到下面的东西
abc //这里的名字要和中的名字相同,因为要根据这个去找对应的类的文件.class,这就是映射的思想
/abc //这里是你在网址栏需要输入的访问路径
关于filter(面试重点)
过滤器Filter
1.需要实现过滤器接口javax.servlet.Filter
2.实现Filter接口的所有方法
init()
初始化方法中可以获得FilterConfig对象,通过此对象可以取得过滤器配置的
初始化参数,完成初始化
doFilter()
为核心方法,每次当请求/响应符号过滤器条件时,过滤器的过滤方法doFilter开始工作
destroy()
此方法中编写资源清理工作
代码:
需要注意的问题:
我们设定过滤的条件一般都在doFilter()方法里面,比如我在里面写对中文字符的处理,
最好写成这样:
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
throws IOException, ServletException {
/*HttpServletRequest ht = (HttpServletRequest) arg0;
ht.setCharacterEncoding("utf-8");*/
HttpServletResponse res = (HttpServletResponse)arg1;
res.setCharacterEncoding("utf-8");
//继续下一个过滤器
arg2.doFilter(arg0, arg1);
}
因为我们在一般的Servlet中,都是用HttpServlet的,所以我们最好将ServletResponse转换
成HttpServletResponse,如果不转类型,也可以,但是以后在处理别的时候可能会
出现一些未知的错误,HttpServletResponse是 ServletResponse的一个子类,所以可以强制类型转换.
在设定完成过滤之后,都是要写上这样一条语句
chain.doFilter(request,response);
这个chain实际上就是上面的arg2,这是一个链,如果不写这个链,那么就会 断链,
就显示不出结果,后果很严重,至于如何添加Filter进url,然后映射到对应的class中请看
下面。
eclipse中添加Filter
在WEB-INF中的web.xml中这样写对应的源码
Chinese
com.just.FilterTest
Chinese
/*
这种写法和传统的Servlet类似,对应的查找方式我就不再叙述。
如果是不想写源码,直接在myeclispse中添加,那么可以在
web.xml中的Design界面去点击Filters,
Add new filter
和Add new filter mapping,分别点击之后,
前者是添加类和名字,后者是添加名字和对应的url,然后重启服务器,一切ok。
完整代码:
public class FilterTest implements Filter{
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
throws IOException, ServletException {
/*HttpServletRequest ht = (HttpServletRequest) arg0;
ht.setCharacterEncoding("utf-8");*/
HttpServletResponse res = (HttpServletResponse)arg1;
res.setCharacterEncoding("utf-8");
//继续下一个过滤器
arg2.doFilter(arg0, arg1);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
如果是登录界面,比如说对登录之后才能才能访问的界面可以做过滤,但是如果登录后的
界面很多,用通配符会将登录页面也覆盖掉,这种情况下,需要将登录页面给做做判断,
使用req.getRequestURI()去得到对应的url路径,然后将url和对应的登录路径做匹配,
条件满足就是登录页面,条件不满足,就是过滤登录里的内容
RequestDispatcher 接口实质
参考http://www.cnblogs.com/lulipro/p/7471987.html
RequestDispatcher接口的概述:public interface RequestDispatcher
定义一个对象,该对象负责在服务器端接收来自客户端的请求并向他们发送资源(例如一个servlet,HTML文件,或者是JSP文件)。servlet容器创建RequestDispatcher对象,用来包装一个给定位置或名字的服务器资源。
该接口被设计于包装servlets,但一个servlet容器可以创建该对象以保证任何类型的资源。
forward()方法概述: public void forward(ServletRequest request,ServletResponse response) throws ServletException,java.io.IOException
推进一个请求到服务器的某个资源(如:servlet,JSP文件,或HTML文件)。该方法允许一个servlet对一个请求作初步处理,而另一个资源将产生响应。
由于一个RequestDispatcher对象是通过getRequestDispatcher()方法获得,ServletRequest对象拥有自己的路径元素和变量以匹配目标资源路径。
forward()方法应该在响应被提交到客户端之前被唤起(在响应主体输出被刷新之前)。如果响应已经被提交,该方法抛出IllegalStateException 。在forward之前,响应未被提交的输出会被自动清理掉。
请求和响应的两个参数必须是与传递给servlet的service()方法相同的对象,或者是由ServletRequestWrapper、ServletResponseWrapper的子类(封装的)对象。
include()方法概述:
public void include(ServletRequest request,ServletResponse response) throws ServletException,java.io.IOException
该方法在响应中包含某些资源的内容(如:servlet,JSP文件,HTML文件)。该方法关键是能包含服务器端的程序。
ServletResponse对象包含来自调用者的保持不变的路径元素和参数。被包含的servlet不能改变响应状态代码或设置头信息;任何制造改变的尝试都会被忽略。
请求和响应的两个参数必须是与传递给servlet的service()方法相同的对象,或者是由ServletRequestWrapper、ServletResponseWrapper的子类(封装的)对象。
最后,见ServletContext.getRequestDispatcher(java.lang.String), ServletContext.getNamedDispatcher(java.lang.String), ServletRequest.getRequestDispatcher(java.lang.String)
监听器(面试重点)
监听器类型有以下几种:
ServletContext对象监听器
ServletContext对象属性监听器
HttpSession对象监听器
HttpSession对象属性监听器
HttpServletRequest对象监听器
HttpServletRequest对象属性监听器
例如:当session清除的时候,被监听器获取到
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除