JSP笔记乱

jsp

jsp是指 Java Serve Page,在html中嵌入java代码,由应用服务器中的jsp引擎来编译和执行嵌入的java脚本代码,然后生成的整个页面信息返回给客户端。

需经历3个阶段,翻译(.jsp–>_jsp.java),编译(jsp.java–>.class)执行。如果jsp有修改,则要重新经历3个阶段。

jsp页面包含的内容

指令<%@…….%>
表达式<%=…….%>
java脚本<%……%>
声明<%!…….%>

注释:html注释 
     jsp注释<%-- --%> //查看网页源代码时不显示
java脚本中的注释:
     <% //....  %>
     <% /*.... */ %>

jsp内置对象

jsp内置对象是web容器创建的一组对象,直接使用,而无需实例。九大的内置对象有:

内置对象 作用域
out page
request request
response page
application application
session session
page page
pageContext page
exception page
config page

jsp中存在四种作用域

  • application (在所有web应用都有效,服务器关闭则失效)
  • session (在当前会话中有效,与服务器断开连接则失效)
  • request (在当前请求中有效)
  • page (只在本页面中有效)
reqeust

在jsp界面一开始设置request.setAttribute(key, value);
然后在界面中,是可以获取到刚设置的request的

jsp打开后的乱码问题

对于post请求,request.setCharacterEncoding(“XXX”); 设置成与你页面一致的编码格式。
对于get请求,上面的做法没有办法,在Tomcatserve.xml里配置编码格式

<Connector port="8080" .... URIEncoding="UTF-8">

jsp中少见的格式

<%
if (key) {
    //dosomething
%>
<%=Expression%>
<% } %>

三种指令

<%@page ...%>
<%@include ...%>
<%@ taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core" %>  //这个主要用于加载JSTL

通过链接跳转页面

jsp中通过链接跳转页面时,request携带的信息和设置的attribute都失效,只能通过链接的GET方式来提交。

<a href="xxx.com?key=value&key2=value2">a>

重定向和转发

重定向:客户端行为,response.sendRedirect(url),本质上是等同于两次请求,第一次请求对象不保存,地址栏改变。
转发:服务端行为,request.getRequestDispacher(url),获得RequestDispacher对象,调用forward(request,response)。地址栏不变。request是src界面向dest界面发送的一个请求,其中数据的生命周期只存在一个请求中,所以在dest界面用转发并不会保留src请求中的数据

request获取表单数据

对于复选框checkbox来说,调用request.getParameter(name);如果复选框有被勾选,那么value会一同被提交上来,为true,如果没有勾选,那么是null;

JavaScript代码中的jsp

在JS代码中可以插入jsp的表达式,如 var a = <%=parameter%>

servlet的三种启动方式

  • 在web.xml中的设置标签,随服务器一起启动。
  • 当服务器的启动后,客户端首次向servlet发送请求。
  • 当servlet程序有改动时,需要重新启动服务器。

servlet的执行顺序

如果服务端没有servlet,那么会像单例模式一样去创建,实例【执行构造函数和init()方法】;
然后响应客户端的请求,调用servlet的doGet或者doPost方法【如果客户端多次请求,那么不必再实例化了,直接doGet或doPost】;
当服务要关闭的时候,就要收回servlet占用的内存,执行析构函数;

servlet是实现了GenericServlet接口的类,可以重写service()方法,则不论是何种提交,都会执行service();

在web.xml中,在标签中,可以设置一个[number],[number]为一个大于零的数字,表示servlet随服务器创建的时候一起创建。如果数值越小,那么优先级就越高。

错误界面

jsp中定义错误面

  • 在<%@page …. errorPage=”error.jsp”%> 加上errorPage,并加上url,那么当发生错误的时候,就会跳转到错误界面
    在error.page的顶部<%@page …..isError=”true”%>,然后在此错误界面中,就可以使用exception对象了。
  • web.xml中配置,不必想前面的一个方法在源jsp中设置,标签如下:
<error-page>
    <exception-type>java.lang.Exceptionexception-type>
    <location>[error界面的url,如果在webroot下要加上“/”]location>
error-page>
  • 对于特定的错误代码,比如404或者500的错误,因为用户需要的是友好的界面,所以我们可以让其跳转到一个经过美化的界面中
 <error-page>
    <error-code>404error-code>
    <location>[error界面的url]location>
 error-page>

要将Cookie放入客户端,需要调用Cookie.addCookie(),并且还需要设置有效期setMaxAge()。才可以将Cookie写入到客户端,要想立即获取刚写入的Cookie必须要进入其他的页面,通过request.getCookie(); 重复写入同一个Cookie对象会覆盖之前的,并且有效期重新计算。

Cookie犯的错误

在Cookie ck = new Cookie(key, value)中,如果key中使用的是邮箱的格式来存储,那么调用request.getCookies()时,无法获取这个设定的Cookie。此外,如果用了中文,需要调用到java.net.*包中的加码和解码java.net.URLEncoder的编码方式,java.net.URLDecoder是解码方式。

session

session表示的一次会话,比如链接到了百度首页,然后你又进入了百度贴吧等等,只要和百度有关系,那么都是在这一个会话当中。当你退出了百度,或者关闭了浏览器,那么便结束了当前的会话。

同request一样,session也有设置属性的方法,不过比request更优秀的是,它的value是一个Object,是可以包含对象的。

在浏览器的 设置》内容设置》所有cookie和数据内容 中,可以查找localhost的Cookie信息,里面有一个JsessionId,是用来标记不同的会话,其生命周期为关闭会话时消失。

session设置失效的时间

<session-config>
    <session-timeout>"minutes表示时间,单位分钟"</session-timeout>
</session-config>

虚拟路径

context 默认是和工程名一致。在myeclispse中,工程右键》properties》myeclispse》web 然后在右侧有context-root可以修改,修改后,要重新部署(deploy),之后无法通过工程名来访问,而是用新的虚拟路径来访问了。

out 与 response.getWriter()的区别

out作为内置类,本质上也是PrintWriter类的对象,而response.getWriter()得到的也是PrintWriter类的对象。
out输出其实是利用了缓冲区,因此其中除了包含println(),常用的方法外,还有

  • clear() 清除缓存区,在flush后面使用会报错
  • clearBuffer() 清除缓存区,在flush()后面使用不会报错
  • flush() 冲刷缓存区
  • close() 关闭流

response得到的PrintWriter对象和out不同,即便out写在PrintWriter之前,如果没有立即的冲刷缓冲区,那么输出的内容是在PrintWriter之后的。

out.println(out输出);
//调用flush();就可以让out在pw之前输出

PrintWriter pw = response.getWriter();
pw.println("response输出");

JSTL

等价于我们在request中设置属性


如果没有指定scope,remove默认是从所有域中移除这个变量

request.setAttribute("num", 123 );  
out value="${num}"  default="321">out> //只有当变量没有值时,才会使用默认值

test中第一个引号后面不能有空格,否则无法匹配

if test="${}">if>  
forEach

begin 和 end 都是索引,闭区间
begin 和 end 都不是必须成对出现的,可以只有其中一个,另一个默认为开头或者结尾

int[] numArr = new int[] {1,2,3,4,5,6,7,8,9,0};
"num"  items="<%=numArr%>"   begin="0"  end="7"  step="1">
    ${num}
choose

JSTL中有与java语言中switch类似的choose语言。
当有条件符合时,便不再执行其他条件


    when test="condition1">
        //execute body
    when>
    when test="condition1">
        //execute body
    when>
    when test="condition1">
        //execute body
    when>
     //类似else
        //execute body
    

JSTL自定义标签

除了使用JSTL中标准的标签之外,我们也可以使用我们自己定义的标签。
实现步骤如下:

  • 编写标签处理类,继承tagSupport类
  • 创建描述性文件xxx.tld,放在web-inf
  • 在JSP中使用

EL

四种取值范围

  • page
  • request
  • session
  • application

EL中符号

运算符 EL中等价表示方法
+ (仅具有算术功能)
- request
* page
/ div
% mod
== eq
!= ne
< lt
> gt或greater
<= le
“>=” ge
&& and
“!” not
!=null not empty
判断是否为null 空串 空集合 empty

${param}

对于${param.xxx}等价于request.getParameter(“XXX”);
${paramValues.xxx}用于获取一个数组,如果${paramValues.xxx[i]}中i比实际获得的参数个数大,那么得到的结果是空串。如果你选取的是对于复选框,没有选中的值就不显示。

JSP中转发和重定向的路径问题

假设工程路径为 http://localhost:8080/webproject/ 我记作 serve/webproject/
重定向
相对路径
response.sendRedirect(“files/test.jsp”);
如果当前的路径是 serve/webproject/doc
那么相对路径是是 serve/webproject/
重定向的位置为 serve/webproject/files/test.jsp

绝对路径
response.sendRedirect(“/files/test.jsp”);
当路径以”/”开头时,表示访问的是根目录即 serve
那么这个重定向将跳转至 serve/files/test/jsp
所以正确跳转,需要前面加上context ( context+”/files/test.jsp” );

转发
相对路径
request.getRequestDispacher(“files/test.jsp”).forward(request, responese);
如果当前的路径是 serve/webproject/doc
那么相对路径是是 serve/webproject/
转发的位置为 serve/webproject/files/test.jsp

绝对路径
request.getRequestDispacher(“/files/test.jsp”).forward(request, responese);
当路径以”/”开头时,表示访问的是工程目录即 serve/project
那么这个重定向将跳转至 serve/project/files/test/jsp

JSP模板的路径

在一些jsp模板中可以看到这两行代码

String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServeName()+":"+request.getServePort()+path+"/"

path相当于webproject
basePath serve/webproject/

在你的html头部中加入”>则该页面的所有url都是基于这个地址做跳转的

原生AJAX的使用步骤

创建XMLHttpRequest对象

以为IE浏览器和其他浏览器使用的对象不同,IE使用的是ActiveXObject对象,其他是使用XMLHttpRequest对象,所以要对浏览器进行判断。

function getXMLHttpRequest(){
    if(window.XMLHttpRequest){
        return new XMLHttpRequest(); //IE8+
    }else{
        return new ActiveXObject("Microsoft.XMLHTTP"); //IE 5 6 7
    }
}
建立链接

调用建立好的XMLHttpRequest对象的open(method, url, async)方法
url中带入你想要传递的参数“?key1=value1&key2=value2…”

发送请求

AJAX根据你请求方式的不同,send()也有所差异
如果你是GET请求方式,那么直接XMLHttpRequest.send();
如果是POST请求方式,那么再发送请求前,必须要指定请求头,在html中默认的POST请求方式是“application/x-www-form-urlencoded”,因此请求头需要这样写:
XMLHttpRequest.setRequestHeader(“Content-type”,”application/x-www-form-urlencoded”);
然后在send(data); data为你要发送到后台的参数.

AJAX和缓存

当用户访问一个特定的界面时,浏览器会首先尝试从缓存里加载页面,而不是立即提交HTTP请求。AJAX异步请求时,要求每次都生成一个新的HTTP请求。
解决方法是在请求数据里添加一个参数,赋予它一个随机的无意义的值。只要URL里的随机内容每次都是不一样的,就能让浏览器觉得这是一个发给新地址的请求。
可以使用随机数或者时间戳。 时间戳(new Date().getTime());

JSP中JavaBean的简单介绍

JavaBean是一类符合特定约束的java类,本质上与一般的java类并没有什么不同,一般的,bean需要符合以下几个条件

  • 是一个公开类
  • 含无参构造方法
  • 所有的域为私有域
  • 对于所有的域,有对应的set和get方法
JavaBeans的作用域范围
  • page
  • request
  • session
  • application
    可以通过使用内置对象来验证创建的bean对象是否在对应的作用域中
在jsp中使用javabean的标签为
<jsp:useBean id="/*创建对象名*/"  class="/*bean类*/" scope="/*作用域,默认page*/">jsp:useBean>

例如:

等价于 request.setAttribute("mike", new User()); 得到的是一个只有空的对象。

JavaBean中setProperty

有四种设置方式


  • 根据表单提交的内容,自动匹配与Mike对象中属性对应的值

  • 根据表单提交的内容,匹配制定的属性,该例子中为userName

  • 手动设置userName属性为Micheal
  • getProperty

    获取mike对象中的userEmail属性

表单url提交

如果表单的提交方式GET action=”url?key=value”,这里是无法传递action中的参数的,GET提交会被表单中的控件内容。如果是POST提交方式,则是可以的。

你可能感兴趣的:(Java语言)