您的位置:首页 > Web前端 > JavaScript

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息