轻量级JavaEE企业应用实战(五)

虽然常把基于WEB应用称为B/S架构的应用,但其实WEB应用一样是C/S结构的应用。只是这种应用的服务器是WEB服务器,而客户端是浏览器
application对象

对于大部分浏览器而言,通常负责三种事情:

(1)向远程服务器发送请求
(2)读取远程服务器返回的字符串数据
(3)负责根据字符串数据渲染出一个丰富多彩的页面

web服务器大致需要完成几个步骤:
1.启动单独的线程
2.使用I/O流读取用户的请求数据
3.从请求数据中解析参数
4.处理用户请求
5.生成相应数据
6.使用IO流向客户端发送请求数据
上述步骤1、2、6通用,3、4、5根据用户请求方式不同和请求参数不同相应方式不同;
当页面的静态内容、JSP脚本转换为_jspService方法时,这些执行代码完成解析参数、处理请求,生成响应等业务功能,而
WEB服务器负责完成多线程、网络通信等底层功能

几乎所有的服务器都会提供4个Map结构,分别是application、session、request、page,并且4个的区别范围是不同的
application:对整个web应用有效,一旦JSP、Servlet将参数放入application中,可以被其下所有的JSP、Servlet访问
session:仅对一次会话有效,放入的数据可以被本次会话的所有JSP、servlet访问
request:仅对本次请求有效
page:仅对当前页面有效
JSP中的application、session、request、pagecontext分别来操作对应的几个结构范围中的数据
在servlet中并没有application的内置对象,所以使用:
ServletContext sc = getServletConfig().getServletContext();方法来获取该WEB应用的ServletContext实例,并且在web应用中这个实例是唯一的
在JSP使用application.getInitParameter(String paramName);方法获取web应用的配置参数;这些配置元素必须在web.xml中使用context-param配置
例如:

 <context-param>
     <param-name>driver</param-name>
     <param-value>com.mysql.jdbc.Driver</param-value>
 </context-param>

config对象

config对象代表当前JSP的配置信息,由于JSP无须配置,所以在JSP中使用很少;在servlet中使用较多
例如:
JSP使用实例:

<%=config.getServletName()%>
<%=config.getInitParameter("age")%>
<servlet>
    <servlet-name>config</servlet-name> //servlet名称
    <jsp-file>/config.jsp</jsp-file> //指定哪个JSP页面配置成servlet
    <init-param>
        <param-name>age</param-name>
        <param-value>23</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>config</servlet-name>
    <url-pattern>/config</url-pattern>
</servlet-mapping>

exception对象

JSP异常处理的一部分,实际上所有可能出现的异常都可以交给错误处理界面处理

实例:

public void _jspService(HttpServletRequest requet, HttpServletResponse response) throws java.io.IOException, ServletException {
    try{
        //所有JSP脚本,静态HTML部分都会转换成这部分代码
    } catch(Throwable e) {
        if(_jspx_page_context != null)
            _jspx_page_context.handlePageException(t);
        }
    }finally{
        //释放资源
        _jspFactory.releasePageContext(_jspx_page_context);
    }

out对象

out对象代表一个页面输出流,通常用于在页面上输出变量及常量。一般使用输出表达式的地方都可以使用out对象
例如:
<%=%> 就是out.write();

pageContext对象

代表页面上下文,用于访问JSP之间的共享数据。使用pageContext可以访问page、request、session、application范围的变量
方法:

getAttribute(String name); //获取page范围内的name属性getAttribute(String name, int scope);//获取指定范围的name,scope范围
PageContext.PAGE_SCOPE; //对应于page范围 
PageContext.REQUEST_SCOPE; //对应于request范围
PageContext.SESSION_SCOPE; //对应于session范围
PageContext.APPLICATION_SCOPE; //对应于application范围

使用getAttribute("str", X); 获取的数值分别是1、2、3、4

不仅如此,pageContext还可以获取其他对象

ServletRequest getRequest(); //获取request对象
ServletResponse getResponse(); //获取response对象
ServletConfig getServletConfig(); //获取config对象
ServletContext getServletContext(); //获取application对象
HttpSession getSession(); //获取session对象

request对象

request代表本次请求范围,web应用是请求/响应架构,除去请求还会发送一些请求头,服务器解析头/请求参数的就是JSP或servlet,而
JSP和servlet获取的途径就是request

方法:
String getParameter(String name); //获取name请求参数的值
Map getParameterMap(); //获取所有请参数名和参数值组成的Map对象
Enumeration getParameterNames(); //获取所有请求参数名所组成的Enumration对象
String[] getParameterValues(String name); //获取name请求参数的值,当有多个值时,返回多个值组成的数组
HttpServletRequest提供了访问请求头的方法:
String getHeader(String name); //根据指定请求头的值
java.util.Enumeration getHeaderNames(); //获取所有请求头的值
java.util.Enumeration getHeaders(String name); //获取指定请求头的多个值
int getIntHeader(String name); //获取指定请求头的值,并将其转换成整数
get和post请求

get请求方式:
将请求参数的名和值转换成字符串,并附加在原URL后,因此可以在地址栏中看到参数名和值
传送的数据量较小,一般不能大于2KB
如果form元素没有设置method方法,默认使用get方式
post请求方式:
发送的数据量较大,通常认为不受限制,往往取决于服务器的限制
发送的请求参数以及对应的值,放在HTML HEADER中传输,用户不能在地址栏看到请求的参数,安全度较高
forward和direct

从地址栏上:
forward是服务器请求资源,访问目标的URL,并将响应数据返回给浏览器,浏览器不知道从哪里来的,所以地址栏不变
direct是服务区根据逻辑,发送一个状态码,告诉浏览器去哪里请求,所以URL是新的
从数据共享上:
forward转发页面和目标页面可以共享request数据
direct不可以共享数据
从运用上:
forward一般用于登录,根据角色访问其他模块
direct一般用于注销时返回登录界面或其他页面
从效率上:
forward效率高
direct效率高

response对象

response代表服务器对客户端的响应,大部分情况下无须使用。但是,如果在JSP页面动态生成一幅位图或者输出一个PDF文档,此时必须使用response

对于生成非字符响应的情况,就应该使用response来响应客户端请求,HttpServletResponse接口提供了getOutputStream方法

增加cookie对象

增加cookie对象也是用response对象完成的,cookie通常用来记录客户的某些信息,比如用户名或者喜好。
cookie和session的不同之处在于:session会随着浏览器关闭而失效,而cookie会一直存放在客户端机器上,除非超出cookie的生命期限

response对象提供了 void addCookie(Cookie cookie)方法来增加Cookie
步骤:
创建Cookie实例,Cookie的构造器为Cookie(String name, String value)
设置Cookie的生命期限,即该Cookie在多长时间失效
向客户端写Cookie
例如:

Cookie cookie = new Cookie("username", name); //创建Cookie对象
cookie.setMaxAge(24*3600); //设置生存期限
response.addCookie(cookie); //向客户端增加Cookie
顺带:
Cookie[] cookies = request.getCookies(); //使用request获取cookie
for(Cookie c : cookies) {
    if(c.getName().equals("username")){ //获取需要的cookie
        out.println(c.getValue());
    }
}

session对象

session也是非常常用的对象,代表用户的一次会话(从客户端浏览器连接服务端开始,到客户端浏览器断开为止)
经常用于:判断用户是否登录、跟踪用户购买的商品等等

session的属性值可以是任何可序列化的JAVA对象

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章