JSP的9个内置对象
2017-10-06 16:17
369 查看
转发和重定向的区别
转发重定向
<%
response.sendRedirect(“msg.jsp”);
%>
(1)转发它是服务器的内部行为 URL地址不变 一个请求一个响应
重定向服务器的外部行为,强制用户发出另一个请求,两个请求,两个响应,URL地址改变
(2)由于转发是服务器的内部行为,只能转发到本服务器上的其他资源(jsp、servlet) 不能跳到其他服务器的资源 如百度
重定向由于是服务器的外部行为,可以跳转到其他服务器的资源
forward和include的区别
Servlet 中 使用转发代码转发 到 success.jsp 先执行success.jsp然后由success.jsp给用户响应、响应完以后留就关闭了,再执行servlet中转发
后面的代码,如果转发后面的代码 还有输出语句 用户并不会看到(因为流已经关闭了)
而include是相当于把succcess.jsp输出的内容包含在这个位置(流并没有关闭),所以
如果include后面 还有输出的代码 用户可以看到…
JSP内置对象 9个
JSP内置对象:在JSP页面不用new 就能直接使用的对象jsp servlet
request HttpServletRequest
response HttpServletResponse
session HttpSession
application ServletContext
page Object
pageContext PageContext
config ServletConfig
out JspWriter
exception Throwable
一.request
主要的方法有
getParameter(String name) 获得参数值,name参数名,form中的name
getParameterValues(String name)或者指定参数的所有值
setAttribute(String name,Object object)
getAttribute(String name)
getSession(true) 返回和请求相关的session,如果没有则创建一个新的session
request.setCharacterEncoding(“utf-8”);
二.response
主要的方法有
setContentType(“text/html;charset=utf-8”);
sendRedirect(String location) 重定向一个页面
sendError(int errorCode,String msg) 重定向到错误页面 错误码、错误描述
三.session
主要的方法有
setAttribute(String name,Object object)
getAttribute(String name)
removeAttribute(String name)
invalidate() session失效
四.application
主要的方法有
setAttribute(String name,Object object)
getAttribute(String name)
五.page
Object类的一个实例,它是JSP本身 相当于转换成的servlet中的this
六.pageContext
页面的上下文环境,管理页面中的内置对象
setAttribute(String name,Object object)
getAttribute(String name)
若干获得内置对象的方法
因为内置对象可以直接使用,所以没必要再通过它取出来,多此一举,所以不用
除非想使用EL表达式访问本页面定义的变量 可以把变量先存到pageContext中
<% try { service.addCategory(category); target = "success.jsp"; } catch (Exception e) { target = "failed.jsp"; e.printStackTrace(); } pageContext.setAttribute("target", target); %>
七.config
主要的方法有
getInitParameter(String name): 返回初始化参数的值
init(ServletConfig config){
String encoding = config.getInitParameter("encoding");
}
web.xml
encoding
UTF-8
config一般的话 不会JSP配置一个初始化参数,所以说一般config对象不用
如果实在想给JSP页面配一个初始化参数,怎么配?
配置方式和servlet的初始化参数配置方式 一样
(1)web.xml
config
/config.jsp
<init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <load-on-startup>2</load-on-startup>
config
/config
(2)config.jsp
配置JSP全局异常处理
在每个JSP页面都配置errorPage比较麻烦!如何解决? 使用JSP全局异常处理,它可以针对不同的错误代码和异常类型跳转到不同的页面 在web.xml加入 <error-page> <error-code>404</error-code> <location>/404.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/500.jsp</location> </error-page> <error-page> <exception-type>java.lang.ArithmeticException</exception-type> <location>/arithmetic.jsp</location> </error-page> <error-page> <exception-type>java.lang.NullPointerException</exception-type> <location>/nullPointer.jsp</location> </error-page>
数据共享问题
request:在同一个请求范围内的页面之间(Servlet)数据共享转发是同一个请求,重定向是另一个请求
再点超链接、提交、普通按钮..都是另一个请求 都无法再从request对象取
做一般业务 比如CRUD 使用request就可以了,但是有一个需求满足不了
购物车..
http 无状态 每个request之间都是独立的 第一个request 响应完了以后 服务器就把它忘了
所以有了个技术 会话跟踪
session 会话范围能有效
IE浏览器的打开就是一个会话
request 请求同一个范围内有效
转发是同一个请求 另一个servlet能取到
target = “msg.jsp”
request.getRequestDispatcher(request,response);
重定向是另一个请求 重定向取不到
会话跟踪技术
1.使用的是cookie技术实现的
2.如果客户端禁用了cookie 这样第一次响应的时候 本来要写会一个jsessionid,客户端不让你写到客户端
这样当第二次发送请求时 jsessionid
4000
什么也没有
URL重写
本来
<a href="ProductServlet;jsessionid=001?action=buy&pname=note3">note3</a>
9.application ServletContext web应用程序内共享 同一个web应用程序 共享一个application
需求:网站计数器
统计一个该一共有多少人访问
和购物车的代码一样
为了记录之前的访问次数,应该在关闭服务器的时候把 计数器的值保存到web.xml里 下次启动服务器的时候读进来
web.xml
<context-param> <param-name>count</param-name> <param-value>1000</param-value> </context-param>
启动的时候应该读出来
监听器(相当于js的事件处理函数)
相当于js中的事件处理函数ServletContext对象.被创建时 = 事件处理函数
ServletContext对象什么时候被创建 服务器启动的时候被创建!!!!
dom对象.事件 = 事件处理函数
btn1.onclick = test;
实现监听器的步骤两步
1.实现监听器接口 监听器有很多 并实现接口的所有方法
package com.listener;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
//监听ServletContext对象的监听器
public class MyServletContextListener implements ServletContextListener{
//当ServletContext对象创建时 执行(tomcat启动时创建) @Override public void contextInitialized(ServletContextEvent sce) { System.out.println("tomcat启动了"); ServletContext application = sce.getServletContext(); String count = application.getInitParameter("count"); System.out.println("count=" + count); application.setAttribute("accessCount", new Integer(count)); } //当ServletContext对象销毁时执行(tomcat关闭时) @Override public void contextDestroyed(ServletContextEvent arg0) { System.out.println("tomcat停止了"); System.out.println("使用dom4j把application中的accessCount 保存到web.xml中"); }
}
2.在web.xml配置监听器
放在最前面
com.listener.MyServletContextListener
计数器页面代码如下
过滤器
why多个servlet中如果出现相同的代码(字符编码集处理,权限验证等),提到过滤器中
1.代码冗余,不可复用
2.如果需求变了,要一个一个改,不可维护,不符合OCP原则
what
javaEE组件,在请求到达servlet之前和之后执行。
可插拔的组件 使用起来很方便 灵活性强
how
需求:字符编码集过滤器
1.编写过滤器类
package com.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CharacterFilter implements Filter{
@Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { System.out.println("CharacterFilter前置执行1"); //一.转换成带http的 HttpServletRequest request = (HttpServletRequest)req; HttpServletResponse response = (HttpServletResponse)res; //二.设置编码集 request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); //把请求交给下一个过滤器 如果后来没有过滤器 那么执行servlet的doGet()或doPost()方法 chain.doFilter(request, response); System.out.println("CharacterFilter后置执行5"); } @Override public void destroy() { }
}
2.在web.xml中配置过滤器
<filter> <filter-name>CharacterFilter</filter-name> <filter-class>com.filter.CharacterFilter</filter-class> </filter> <filter-mapping> <filter-name>CharacterFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 过滤器的详细配置 <filter-mapping> <filter-name>CharacterFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>INCLUDE</dispatcher> <dispatcher>ERROR</dispatcher> </filter-mapping>
指定request、forward、include、error方式的请求会穿过过滤器
Error: index.jsp 中加一个errorPage=”error.jsp” , 当index.jsp出错时会跳到errorPage页面,
这时会再次经过过滤器.
保护页面资源的安全性
可以把JSP页面放到WEB-INF下 WEB-INF下的资源无法直接访问
例如: 只把后台管理员的登录界面暴露出来 其他管理页面都放到WEB-INF下附录:修改MyEclipse中的编码都为utf-8
1.工作空间utf-8
2.指定Web 工程的编码 utf-8
3.参见utf-8.txt修改 使创建的html、jsp等文件默认编码都是utf-8
相关文章推荐
- JSP脚本中的9个内置对象
- jsp 之 内置对象(9个)
- JSP的9个内置对象之config对象
- JSP脚本中的9个内置对象---08 response对象
- jsp的9个内置对象
- jsp中9个内置对象与servlet对应关系及四个作用域
- JSP脚本的9个内置对象(三)——exception对象
- jsp的9个内置对象
- JSP系列四:JSP9个内置对象
- JSP基本语法、3个编译指令、7个动作指令、9个内置对象
- jsp小结14 - 9个内置对象07 request
- 三种跳出循环的方法--9个jsp内置对象
- JSP的9个内置对象惯用法
- JSP的9个内置对象
- JavaEE基础:JSP的9个内置对象
- JSP脚本中的9个内置对象
- JSP的9个内置对象
- JSP中的9个内置对象
- JSP脚本中的9个内置对象
- Jsp9个内置对象