jsp是指 Java Serve Page,在html中嵌入java代码,由应用服务器中的jsp引擎来编译和执行嵌入的java脚本代码,然后生成的整个页面信息返回给客户端。
需经历3个阶段,翻译(.jsp–>_jsp.java),编译(jsp.java–>.class)执行。如果jsp有修改,则要重新经历3个阶段。
指令<%@…….%>
表达式<%=…….%>
java脚本<%……%>
声明<%!…….%>
注释:html注释
jsp注释<%-- --%> //查看网页源代码时不显示
java脚本中的注释:
<% //.... %>
<% /*.... */ %>
jsp内置对象是web容器创建的一组对象,直接使用,而无需实例。九大的内置对象有:
内置对象 | 作用域 |
---|---|
out | page |
request | request |
response | page |
application | application |
session | session |
page | page |
pageContext | page |
exception | page |
config | page |
jsp中存在四种作用域
在jsp界面一开始设置request.setAttribute(key, value);
然后在界面中,是可以获取到刚设置的request的
对于post请求,request.setCharacterEncoding(“XXX”); 设置成与你页面一致的编码格式。
对于get请求,上面的做法没有办法,在Tomcatserve.xml里配置编码格式
<Connector port="8080" .... URIEncoding="UTF-8">
<%
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请求中的数据
对于复选框checkbox来说,调用request.getParameter(name);如果复选框有被勾选,那么value会一同被提交上来,为true,如果没有勾选,那么是null;
在JS代码中可以插入jsp的表达式,如 var a = <%=parameter%>
如果服务端没有servlet,那么会像单例模式一样去创建,实例【执行构造函数和init()方法】;
然后响应客户端的请求,调用servlet的doGet或者doPost方法【如果客户端多次请求,那么不必再实例化了,直接doGet或doPost】;
当服务要关闭的时候,就要收回servlet占用的内存,执行析构函数;
servlet是实现了GenericServlet接口的类,可以重写service()方法,则不论是何种提交,都会执行service();
在web.xml中,在标签中,可以设置一个[number],[number]为一个大于零的数字,表示servlet随服务器创建的时候一起创建。如果数值越小,那么优先级就越高。
<error-page>
<exception-type>java.lang.Exceptionexception-type>
<location>[error界面的url,如果在webroot下要加上“/”]location>
error-page>
<error-page>
<error-code>404error-code>
<location>[error界面的url]location>
error-page>
要将Cookie放入客户端,需要调用Cookie.addCookie(),并且还需要设置有效期setMaxAge()。才可以将Cookie写入到客户端,要想立即获取刚写入的Cookie必须要进入其他的页面,通过request.getCookie(); 重复写入同一个Cookie对象会覆盖之前的,并且有效期重新计算。
在Cookie ck = new Cookie(key, value)中,如果key中使用的是邮箱的格式来存储,那么调用request.getCookies()时,无法获取这个设定的Cookie。此外,如果用了中文,需要调用到java.net.*包中的加码和解码java.net.URLEncoder的编码方式,java.net.URLDecoder是解码方式。
session表示的一次会话,比如链接到了百度首页,然后你又进入了百度贴吧等等,只要和百度有关系,那么都是在这一个会话当中。当你退出了百度,或者关闭了浏览器,那么便结束了当前的会话。
同request一样,session也有设置属性的方法,不过比request更优秀的是,它的value是一个Object,是可以包含对象的。
在浏览器的 设置》内容设置》所有cookie和数据内容 中,可以查找localhost的Cookie信息,里面有一个JsessionId,是用来标记不同的会话,其生命周期为关闭会话时消失。
<session-config>
<session-timeout>"minutes表示时间,单位分钟"</session-timeout>
</session-config>
context 默认是和工程名一致。在myeclispse中,工程右键》properties》myeclispse》web 然后在右侧有context-root可以修改,修改后,要重新部署(deploy),之后无法通过工程名来访问,而是用新的虚拟路径来访问了。
out作为内置类,本质上也是PrintWriter类的对象,而response.getWriter()得到的也是PrintWriter类的对象。
out输出其实是利用了缓冲区,因此其中除了包含println(),常用的方法外,还有
response得到的PrintWriter对象和out不同,即便out写在PrintWriter之前,如果没有立即的冲刷缓冲区,那么输出的内容是在PrintWriter之后的。
out.println(out输出);
//调用flush();就可以让out在pw之前输出
PrintWriter pw = response.getWriter();
pw.println("response输出");
等价于我们在request中设置属性
如果没有指定scope,remove默认是从所有域中移除这个变量
request.setAttribute("num", 123 );
out value="${num}" default="321"> out> //只有当变量没有值时,才会使用默认值
test中第一个引号后面不能有空格,否则无法匹配
if test="${}"> if>
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}
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中标准的标签之外,我们也可以使用我们自己定义的标签。
实现步骤如下:
运算符 | EL中等价表示方法 |
---|---|
+ | (仅具有算术功能) |
- | request |
* | page |
/ | div |
% | mod |
== | eq |
!= | ne |
< | lt |
> | gt或greater |
<= | le |
“>=” | ge |
&& | and |
“!” | not |
!=null | not empty |
判断是否为null 空串 空集合 | empty |
对于${param.xxx}等价于request.getParameter(“XXX”);
${paramValues.xxx}
用于获取一个数组,如果${paramValues.xxx[i]}
中i比实际获得的参数个数大,那么得到的结果是空串。如果你选取的是对于复选框,没有选中的值就不显示。
假设工程路径为 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模板中可以看到这两行代码
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServeName()+":"+request.getServePort()+path+"/"
path相当于webproject
basePath serve/webproject/
在你的html头部中加入”>则该页面的所有url都是基于这个地址做跳转的
以为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为你要发送到后台的参数.
当用户访问一个特定的界面时,浏览器会首先尝试从缓存里加载页面,而不是立即提交HTTP请求。AJAX异步请求时,要求每次都生成一个新的HTTP请求。
解决方法是在请求数据里添加一个参数,赋予它一个随机的无意义的值。只要URL里的随机内容每次都是不一样的,就能让浏览器觉得这是一个发给新地址的请求。
可以使用随机数或者时间戳。 时间戳(new Date().getTime());
JavaBean是一类符合特定约束的java类,本质上与一般的java类并没有什么不同,一般的,bean需要符合以下几个条件
<jsp:useBean id="/*创建对象名*/" class="/*bean类*/" scope="/*作用域,默认page*/">jsp:useBean>
例如:
等价于 request.setAttribute("mike", new User());
得到的是一个只有空的对象。
有四种设置方式
根据表单提交的内容,自动匹配与Mike对象中属性对应的值
根据表单提交的内容,匹配制定的属性,该例子中为userName
手动设置userName属性为Micheal
获取mike对象中的userEmail属性
如果表单的提交方式GET action=”url?key=value”,这里是无法传递action中的参数的,GET提交会被表单中的控件内容。如果是POST提交方式,则是可以的。