javaWeb笔记一

在JSP中就是相当于在html页面插入java代码,

使用<% %>中间写java代码,一般是调用方法,

Java输出在页面的语句是out.println(),如<%out.println(“欢迎你!”) %>

关于JSP的4种语法:

  • JSP注解:

JSP注解,它不会输出到客户端,格式如下:

<%-- 注释内容 --%>

与JSP相对应的是html的注释

<!-- 注释内容-->

  • JSP声明:

JSP声明变量与方法语法格式如下:

<%! 声明部分 %>,如下:

<%! public int count;

   Public String info(){

Return “hello”;

}

%>

其中声明的变量与方法会,转换到相应的Servlet类中成为成员变量与成员方法

注意在创建成员变量与成员方法的时候我们可以采用访问修饰符来修饰或者static来修饰,但是不能用abstract来修饰,因为如此JSP转化的Servlet将无法实例化

  • JSP输出表达式:

JSP提供了一种输出表达式值的简单方法,语法格式如下:

<%=表达式%>

该语法取代了 out.println()

在JSP中普通的脚本(<%    %>)中声明的变量在生成Servlet类中作为一个方法的局部变量存在的所以不能使用访问修饰符或者使用static来修饰。

接下来我们将讲述JSP的3个编译指令,7个动作指令,9个内置对象

3个编译指令:

JSP的编译指令在编译期间通知JSP引擎的消息

--page:该指令针对当前页面

--include: 用于指定包含的另一个页面

--taglib:用于定义和访问自定义标签

编译指令语法如下:

<%@ 编译指令名 属性名=“属性值”.... %>

主要介绍page与include

Page: 该指令通常位于JSP页面的最上端,一个JSP页面可以有多条page指令,语法如下:

<% @page

[language=”java”]  //用来设置JSP页面脚本的语言的

[extends=”package.class”] //用来表示JSP页面编译后产生的servlet类的扩展类

[import=”package.class | package.*”] //用来引入外部的java类

[session=”true|false”] //设定该JSP页面是否需要HTTP Session  ,关于HTTP Session可以阅读以下这篇文章:

HttpSession详解 - myseries - 博客园

[buffer=”none | 8kb | size kb”] //指定缓存区的大小。输出缓存区的内置对象有out,用于缓存JSP页面对客户浏览器的输出,默认值是8kb

[autoFlush=”true |false”] //当缓存区溢出,是否强制将缓存区清空,true则是强制清空,如果设置为false如果溢出就会产生异常

[info=”text”] //说明JSP的信息,可以通过Servlet.getServletInfo()方法来获取,如果在JSP中直接调用getServletInfo()方法,因为JSP编译后产生的就是一个Servlet类

[errorPage=”relativeURL”]//指定错误处理页面,当前页面如果产生了异常或出错将会转移到指定的页面上,如果没有设置页面出错将会把错误信息显示在用户的浏览器上,这样明显不友好

[isErrorPage=”true |false”] //指定该页面是否为错误处理页面如果错误处理页面就不需要errorPage属性

[contentType=”mimeType[;charSet=charactherSet]”| “text/html;charSet=ISO-8859-1”]//用于生成网页文件的格式以及编码格式

[pageEncoding =”ISO-8859-1”]//指定网页编码的字符集

%>

注意:JSP中内置了异常机制处理,所以JSP可以不处理异常,及Checked异常

Include指令(静态):他不仅会将文件嵌入到JSP文件当中还会将把目标页面的其他编码指令加载进来,但动态的不会,include可以包含静态文本也可以包含动态的JSP文件,编译指令语法格式如下:

<%@ include file=”relativeURLSpec”%> (relativeURLSpec相对路径)

动作指令:

主要的动作指令有如下7个:

--jsp:forword:执行页面转换,将请求处理转换到另一个页面执行

可以转换到静态的HTML页面,也可以转换到动态的JSP页面,对于JSP1.0使用语法格式如下:

<jsp:forword page=”{relativeURL | <%=expression%>}”/>

在JSP1.1以上它的语法格式如下:

<jsp:forword page=”{relativeURL | <%=expression%>}”>

{<jsp:param...  />}

</jsp:forword>

--jsp:param: 用于传递参数,不能单独使用

--jsp:include:动态包含页面

用于包含页面的,但它只将将其中的html节点插入到文件当中,并不会导入目标页面的编译指令,下面是include动态指令的语法格式:<jsp:include page=”{relativeURL | <%=expression%>}”flush=”true”/> 或<jsp:include page=”{relativeURL | <%=expression%>}”flush=”true”>

<jsp:param name=””value=””>

</isp:include>

将参数传进去被包含文件当中

--jsp:plugin:使用下载javaBean或Applet到客户端执行

--jsp:useBean:创建一个javaBean的实例

--jsp:setProperty:用于设置javaBean实例的属性

--jsp:getProperty:用于获取javaBean实例的属性

以上传递的参数的获取是使用了JSP内置的对象HttpServletRequest获取的,request就是他的一个实例所以我们常用以下方法来获取以上的参数 request.getParameter(“name”)

JSP的9个内置对象:这九个对象多是Servlet API接口实例,只是JSP默认创建它们的实例(在JSP页面对应的Servlet类中的jspServlet()方法中实例),以下是这9个内置对象:

一.

Application:java.servlet.ServletContext的实例,是JSP所在的Web应用本身,可用于JSP页面,或Servlet之间进行信息交互,常用的方法有getAttribute(String attName)、setAttribute(String attName, String attValue)和

getInitparameter(String paraName)  [attribute:n.属性,特质;Init:初始化;parameter:参数 ]

---在B/S中客户端请求后,Web服务器大致需要完成以下步骤:

  1. 启动单独的线程
  2. 使用I/O流来读取用户请求的二进制流数据
  3. 从请求数据中解析出参数
  4. 处理用户的请求
  5. 生成相应数据
  6. 通过I/O数据流传出数据

对于1,2,6步是通用的因为在用户的请求不同时对应的处理也会有所不同所以3,4,5可能不同

实际上3,4,5层是由JSP页面对应的servlet中的_jspService()方法执行的,而Web服务器则实现多线程,网络通信等底层功能

Web服务器执行到第三步时会通过传进来的请求数据和处理过后的相应数据创建HttpServletRequest与HttpServletRespone等对象,作为_jspService方法的参数:

在Web应用进程中服务器调用JSP或Servlet多是独立的,所以在JSP与Servlet中无法产生信息交互

而在大多数Web应用(包括java、ASP、PHP、Ruby)当中多会提供4个Map结构的对象,也就是上图在_jspService方法中初始化的对象,Application、session、request、page[关于Map结构:它是键对象与值对象映射的结构,详细的可以去看数据结构,现在不多见阐述],关于这4个对象的介绍:

Application:对整个Web程序应用多可共享,一旦JSP与Servlet将数据放在Application中将会被应用程序中的所有的JSP与Servlet共享。

Session:将只被当前会话进程访问,会话中可以被其他的JSP与Servlet访问,会话结束后值会被清除

Request:仅在本次请求中有效,该数据将会被本次请求的其他JSP与Servlet访问

Page:仅能被当前页面所访问。

这是个对象扩大了数据的作用范围。

JSP内置对象application、session、request和pageContext在Application、Session、request、page的作用范围之内

Applicaton它的作用是:

  1. 在整个Web应用的多个JSP与Servlet进行数据交互
  2. 访问Web应用中的配置参数

在servlet中访问application的数据。

因为servlet中没有application的内置对象,而application是servletcontext的一个实例,在servlet可以通过以下方法来获取servletcontext的实例:

     Getservletconfig().getServletContext()

获取Web应用中的配置参数:这些配置参数来自于Web.xml中的<context-param>

<param-name>参数名</param-name>

<param-value>参数值</param-name>

</context-param>

application中的getInitParam()方法来获取对应的设置参数值

而这种方式的好处就是避免使用硬编码的形式将写进代码当中,增加了代码的可移植性

二.

Config:java.servlet.ServletConfig的实例,该实例表示的是JSP的配置信息,因为JSP通常不存在配置信息,因此该对象大部分应用于Servlet中有效,常用的方法有getInitParameter(String paramName)和getInitParameternames()等方法,servlet需要在Web.xml中进行配置

三.

 exception对象:Throwable的实例,代表着JSP中产生的异常和错误,是JSP异常机制的一部分,从经典的错误捕捉方法讲起:

Try{

//异常错误代码

}

   Catch(Throwable exception)

{

//异常处理段

}

在普通的JSP中只执行第一部分--代码处理段

由异常处理页面来处理第二部分--异常处理段

在异常处理段落中有一个异常处理对象exception,这就是内置对象。

可以看一下JSP对应的Servlet对象中的_jspServlet方法中所包含的JSP脚本:

可以看的出在JSP中的脚本多放在了try中所以这是我们之前所不需要对脚本去处理异常的原因了

可以看出该方法处理异常的方法是判断jspx_page_context是否为空,如果不为空,错误就交给它来处理,实质上它处理的原理是:看你的JSP页面中是否指出了errorpage属性,如果指出了就请求forword到errorpage指定页面中去,若没有指定该属性将使用系统页面将错误输出。

注意:只有JSP脚本中、输出表达式才会放在对应的_jspService()的try中,而JSP中的声明部分(<%!.... %>)不在这里面,需要自己在jsp中捕捉错误

如果该页面指定iserrorpage为true,该页面将会提供一个exception内置对象来处理异常。

四.

Out对象,out对象表示的是一个页面的输出流,通常用于页面上输出变量和常量,采用out.println()方法

五.

pageContext对象,这个对象表示的是上下文,该对象用于访问JSP之间的共享数据。使用pageContext()可以访问page、request、session、application范围的变量,使用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范围

setAttribute也有以上方法,

不仅如此pageContext还提供了获取其他内置对象的方法:

ServletRequest getRequest(): 获取request对象

ServletResponse getResponse(): 获取Response对象

ServletConfig getConfig(): 获取Config对象

ServletContext getContext(): 获取appliction对象

HttpSession getSession: 获取Session对象

六.

Request对象是HttpServletRequest的实例,该对象用于封装用户的请求,并且所有的Request对象多包涵请求参数的名称与值,它还操作Request范围的属性,它有如下方法来获取用户请求的参数:

---String getParameter(String paramName);获取paramName的值

---Map getParameterMap():获取所有请求参数名与参数值所组成的Map对象

---Enumeration getParameterNames();获取所有请求参数名所组成的Enumenration对象

---String[] getParameterValues(string name):当请求参数name的值为多个的时候获取字符串数组。

在前端页面的表格提交到后端的方法有:
GET:传输的数据可以在URL栏上看到,而且get方法请求的数据有限,一般不能大与2kb=2000b

在Get方法传输中文的话是需要进行一定操作的,不然获取到的中文会是编码之后的编码流。(所以我们一般采用post方法来传输中文)

POST:传输的数据不会显示在URL栏上,保密性高,一般认为post传输的大小无上限,不过还是会限制于服务器的。

在前后两个页面中如果传输的编码格式不一样就需要在接收数据之前将编码格式写入到Request对象当中,用以下方法:

Request.setCharacterEncoding(编码格式);

request请求范围的属性:

当页面forword用户请求时,请求的参数与请求的属性多不会丢,

比如所前端页面提交了一个表在后端的jsp当中,处理完后用forword转发到另一个jsp页面当中,如今的这个页面不仅可以获取forword带的参数还可以获取用户提交表单中的数据,这就是request请求范围。

七.

Response对象,该对象是HttpServletRespone的一个实例,意为响应对象,但一般不会用它来响应对象而是采用输出语句直接输出到页面,而它呢有3大用途:1.输出非字符内容,如图片,PDF文档,Excel文件,JSP中的输出语句out是jspWriter的一个实例,而jspWriter是Writer的子类,Writer是字符输出流,所以无法解决除字符输出流的数据。2.重定向请求。3.增加Cookie,接下来我们一一介绍它的这几个用途:

  1. Response为了生成非字符的数据,有以下这个方法实现:

getOutputStream()

  1. 重定向,与forword不同的是,重定向将会丢失所有的请求参数和request范围的属性,因为重定向是一次新的请求,可以从URL栏上看出,采用forword跳转到另一个界面的URL始终停留在第一个JSP的URL,而重定向的URL将会变成新页面的URL,HttpServletResponse提供了一个sendRedirect(String path)方法,path指重定向的页面路径。
  2. 添加Cookie,这与session不同,session在浏览器关闭后数据就不存在了,而Cookie是写进客户端磁盘当中,在它的最大生命内不会消失,response提供了如下方法来实现:

Void addCookie(Cookie cookie);

从该方法中我们可以看出先得创建一个Cookie实例

Cookie的构造方法为 Cookie(String name,String value)

Cookie有设置Cookie生命周期方法:setMaxAge(int 秒)

注意如果Cookie没有设置生命周期将会在浏览器关闭也关闭

让后就是将Cookie写入客户端response.addCookie(Cookie cookie),访问客户端的Cookie是request对象,该对象提供了getCookie()方法,该方法的返回值是Cookie[]数组

默认情况下是不允许Cookie中包含有中文字符的,如果需要在Cookie中存储中文就需要做如下操作:

借助java.net.URLEncoder先将中文字符编码,存在Cookie中,取出时借助java.net.URLDecoder对其进行解码

Cookie cookie = new Cookie("name", java.net.URLEncoder.encode("张禹", "gbk"));
cookie.setMaxAge(24*3600);
response.addCookie(cookie);

Cookie[] cookies = request.getCookies();
for (Cookie c : cookies)
{
    if (c.getName().equals("name")){
        String value = c.getValue();
        String jbk = URLDecoder.decode(value,"gbk");
        out.println(jbk);
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值