JavaWeb之JSP技术总结
刚接触JSP技术的时候让我想起了在大学学的Asp+VBScript,记得当时我还用aspstudy做了一个小的新闻发布系统作为期末作品,也正是在那时候在卢哥卢老师的指导下走向编程的道路,对编程越来越感兴趣。为什么会让我想起asp呢?因为Jsp和它还挺类似的,asp本身就是把vbscript都放在asp页面,没有像asp.net那样界面与逻辑分离,这样更加清楚。
一、工作原理与生命周期
JSP编译之后也是一个继承HttpServlet的类,所以也能完成HttpServlet能完成的所有事。只是工作方式和Servlet不一样,Servlet是先编译后部署,而jsp是先部署后编译。jsp是一个Servlet那它的生命周期也和Servlet一样,只是它有自己的初始化和销毁方法。
public void _jspInit() {} public void _jspDestroy() {}
我们可以查看下它生成的java类是什么样的。在工作空间下找到下面的路径.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\HelloWorld\org\apache\jsp,会出现两个文件,一个是.java文件,一个是.class文件,当客户端第一次请求时Tomcat先将test.jsp文件转化为.java文件,并将.java文件编译成.class文件,该.class便是jsp对应的Servlet,编译完之后再运行.class文件来响应客户请求,以后客户访问会直接调用.class来响应,下面的代码是.java的代码。
/*
* Generated by the Jasper component of Apache Tomcat
* Version: Apache Tomcat/8.5.9
* Generated at: 2017-03-18 03:41:35 UTC
* Note: The last modified time of this file was set to
* the last modified time of the source file after
* generation to assist with modification tracking.
*/
package org.apache.jsp; import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import com.test.cyw.Person; public final class test_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports { private static final javax.servlet.jsp.JspFactory _jspxFactory =
javax.servlet.jsp.JspFactory.getDefaultFactory(); private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants; private static final java.util.Set<java.lang.String> _jspx_imports_packages; private static final java.util.Set<java.lang.String> _jspx_imports_classes; static {
_jspx_imports_packages = new java.util.HashSet<>();
_jspx_imports_packages.add("javax.servlet");
_jspx_imports_packages.add("javax.servlet.http");
_jspx_imports_packages.add("javax.servlet.jsp");
_jspx_imports_classes = new java.util.HashSet<>();
_jspx_imports_classes.add("com.test.cyw.Person");
} private volatile javax.el.ExpressionFactory _el_expressionfactory;
private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager; public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
return _jspx_dependants;
} public java.util.Set<java.lang.String> getPackageImports() {
return _jspx_imports_packages;
} public java.util.Set<java.lang.String> getClassImports() {
return _jspx_imports_classes;
} public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
if (_el_expressionfactory == null) {
synchronized (this) {
if (_el_expressionfactory == null) {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
}
}
}
return _el_expressionfactory;
} public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
if (_jsp_instancemanager == null) {
synchronized (this) {
if (_jsp_instancemanager == null) {
_jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
}
}
}
return _jsp_instancemanager;
} public void _jspInit() {
} public void _jspDestroy() {
} public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException { final java.lang.String _jspx_method = request.getMethod();
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");
return;
} final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null; try {
response.setContentType("text/html; charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out; out.write("\r\n");
out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n");
out.write("<title>Insert title here</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write("\r\n");
Person person=new Person("CuiYW",25);
out.write('\r');
out.write('\n'); response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
session.setAttribute("Person", person) ;
session.setAttribute("ID", "123456");
session.setAttribute("ID", "abcdef");
session.removeAttribute("ID"); out.write("\r\n");
out.write("\r\n");
out.write("</body>\r\n");
out.write("</html>");
} catch (java.lang.Throwable t) {
if (!(t instanceof javax.servlet.jsp.SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try {
if (response.isCommitted()) {
out.flush();
} else {
out.clearBuffer();
}
} catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
else throw new ServletException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
二、JSP指令
JSP的语法这块比较简单,就此略过。在新建jsp页面时会在页面的第一行会有类似下面的一行代码,它就是jsp指令,
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="com.test.cyw.Person"%>
jsp指令主要来声明jsp页面的一些属性,格式为<%directive{attribute=}*%>,*表示一个或多个属性。JSP最常见的有3种指令:Page,include,taglib.
1.Page指令
Page指令一般生命页面属性,多个属性可以写在一个Page指令或多个Page指令中。不过属性只能出现一次,除了import属性除外。Page指令中常见属性如下:
说明 | 语法格式 | |
---|---|---|
language属性 | language属性主要用来声明所使用的脚本语言种类,目前暂时只能使用Java语言。不过不排除以后可以使用如C、C++或其他语言的可能。language属性的默认值也是java。 | <%@ page language="java"> |
extends属性 | extends属性用来指定该JSP页面生成的Servlet是继承于哪个父类,设定时必须指定该类的全名,即包名加类名。一般很少使用,而且必须慎重的使用,否则可能限制到JSP的编译能力。 | <%@ page extends="继承的父类"%> |
import属性 | import属性用来指定导入的Java包,和Java语言基础中的import语句作用类似。不过有些包在JSP编译时就已经导入了,可以不用再进行导入 | <%@ page import="导入的包名" %> |
session属性 | session属性用来指定该JSP页面中是否可以使用session对象。如果设置为true,则表示该JSP页面中可以使用session对象;如果设置为false,则表示该JSP页面中不可以使用session对象。session属性的默认值为true。 | <%@ page session="true | false "%> |
buffer属性 | buffer属性用来指定输出流是否具有缓冲区,以及设置缓冲区大小。如果设置为none,则表示输出流不具有缓冲功能;如设置为具体的数据,如“40KB”,则表示设置的缓冲区大小为40KB。其默认值为8KB。 | <%@ page buffer="none | 40KB"%> |
autoFlush属性 | autoFlush属性用来指定缓冲区是否自动进行强制输出。如果设置为true,那么当缓冲区满的时候仍然能够输出正常;如果设置为false,那么当缓冲区满的时候,将会产生异常。如果buffer属性设置为none,那么就不能将autoFlush属性设置为false。autoFlush属性的默认值为true。 | <%@ page autoFlush="true | false"%> |
isThreadSafe属性 | isThreadSafe属性用来指定该JSP文件是否支持多线程使用。如果设置为true,则表示该JSP文件支持多线程的使用,也就是表示该JSP文件能够同时处理多个用户的请求;如果设置为false,则表示该JSP文件不支持多线程的使用,也就是表示该JSP文件只能一次处理一个用户的请求。isThreadSafe属性的默认值为true。 | <%@ page isThreadSafe="true | false"%> |
info属性 | info属性用来设置该JSP文件的相关信息,可以是任何的信息字符串,并通过Servlet.getServletInfo方法来取得该信息。 | <%@ page info=“JSP文件相关信息”%> |
errorPage属性 | errorPage属性用来设置如果当前JSP文件发生异常错误时,网页重新跳转到能够处理异常的JSP文件。 | <%@ page errorPage="错误处理页面"%> |
isErrorPage属性 | isErrorPage属性用来指定该JSP文件是否为能够处理异常的JSP文件,其默认值为false。 | <%@ page isErrorPage="true | false"%> |
contentType属性 | contentType属性用来指定该JSP文件的MIME格式,以及网页编码格式。 | <%@ page contentType="text/html;charset=ISO-8859-1"%> |
pageEncoding属性 | pageEncoding属性用来制定网页的编码格式 | <%@ page pageEncoding=” ISO-8859-1”%> |
isELIgnored属性 | isELIgnored属性用来指定该JSP文件是否支持EL表达式。如果设置为true,则表示JSP文件讲忽略EL表达式,也就是EL表达式不会被执行;如果设置为false,则表示EL表达式不会被忽略,该EL表达式将会被执行。 | <%@ page isELIgnored="true | false"%> |
下面来做个实验主要使用下errorPage、isErrorPage属性。
首先新建一个错误页面error.jsp,isErrorPage="true"
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isErrorPage="true"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
this is error page
</body>
</html>
在test.jsp制造一个错误 1/0,抛出异常 errorPage="/error.jsp"
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="com.test.cyw.Person" errorPage="/error.jsp"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body> <% Person person=new Person("CuiYW",25); %>
<%
response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
session.setAttribute("Person", person) ;
session.setAttribute("ID", "123456");
session.setAttribute("ID", "abcdef");
session.removeAttribute("ID"); %>
<%=1/0 %>
</body>
</html>
浏览器请求test.jsp时会跳转到错误页面error.jsp
2.include指令
include指令格式:<%@include file="relativeURL"%>,relativeURL可以是本应用的jsp或html文件路径,用它可以将复用的页面分离出来,类似模板页的功能。
还是接着上面的demo,新建一个jsp页面,part.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
这是错误页面的一部分
</body>
</html>
在error.jsp中使用include指令引入part.jsp
<body>
this is error page<br>
<%@include file="/part.jsp" %>
</body>
</html>
刷新test.jsp请求
3.taglib指令
jsp支持标签技术,taglib用来指明JSP页面用的JSP标签库,格式为:<% taglib url="" prefix=""%>.这个以后会在JSTL标签库中经常用到,就不举例了。
三、行为
jsp行为是一组jsp内置的的标签.jsp行为是对常用jsp功能的抽象与封装。有两种一是自定义的jsp行为,二是标准的jsp行为.自定义的行为就是jsp自定义标签,这个会专门介绍。下面的是标准jsp行为。
1.<jsp:include/>行为
include行为用于运行时包含某个文件。如果被包含的文件是jsp程序,则先会执行jsp程序,后把执行的结果包含进来。语法:<jsp:include page="relativeURL" flush="true"/>,属性page是必需的,为被包含文件的相对路径必须为本web应用程序内的文件。属性flush布尔类型,默认false,设置读入被保存文件内容前是否清空缓存。
这个与jsp指令中的include指令有点类似,把test.jsp中的include 指令换成下面的语句也是显示一样的结果。
<jsp:include page="/part.jsp" flush="true"></jsp:include>
不过,两个的实现原理并不一样。include指令是编译时包含,包含的是源代码,而行为是运行时包含,只保护运行结果,我们可以看下.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\HelloWorld\org\apache\jsp文件夹的文件变化就知道了。
(1).首先使用指令包含part.jsp,请求test.jsp页面,然后查看上面路径文件夹下的文件
<%@include file="/part.jsp" %>
(2).清空该文件下的文件,使用行为来引入part.jsp
<jsp:include page="/part.jsp" flush="true"></jsp:include>
可以看到上面的两个运行之后生成的文件,使用指令是包含源代码,把part.jsp包含在error.jsp中,程序都是先编译后运行,按一个文件编译,编译时包含,而行为是两个分开编译,只是运行的时候把结果包含。
2.使用Java Bean(POJO)Plain Ordinary Java Object 普通的Java类
在asp.net中提交表单数据,从表单中获取数据,在没有MVVM模式的情况下,如果表单中数据比较多,也要一行一行的获取,这样就会变得特别麻烦。MVC中有了MVVM之后可以直接把页面数据映射到VM对象中,这样也不用一行一行的获取变量了,非常方便,JavaBean与它很类似。JavaBean行为是一组与JavaBean相关的行为,包括useBean行为、setProperty行为、getProperty行为。
(1).useBean行为
用于在jsp中定义一个POJO对象.格式:<jsp:useBean id="beanId" class="calssName" scope="value"/>
属性用法:
id: 命名引用该Bean的变量。如果能够找到id和scope相同的Bean实例,jsp:useBean动作将使用已有的Bean实例而不是创建新的实例。
class:指定Bean的完整包名。
scope:指定Bean在哪种上下文内可用,可以取下面的四个值之一:page,request,session和application。
默认值是page,表示该Bean只在当前页面内可用(保存在当前页面的PageContext内)。
request表示该Bean在当前的客户请求内有效(保存在ServletRequest对象内)。
session表示该Bean对当前HttpSession内的所有页面都有效。
application,则表示该Bean对所有具有相同ServletContext的页面都有效。
scope之所以很重要,是因为jsp:useBean只有在不存在具有相同id和scope的对象时才会实例化新的对象;如果已有id和scope都相同的对象则直接使用已有的对象,此时jsp:useBean开始标记和结束标记之间的任何内容都将被忽略。
(2)getProperty行为
useBean定义了对象之后,使用getProperty行为来获取useBean对象的属性.<jsp:getProperty name="beanName" property="propertyName"/>
(3)setProperty行为
useBean定义了对象之后,使用getProperty行为来设置useBean对象的属性.<jsp:setProperty name="beanName" property="propertyName" value=""/>
实验一 :提交表单
1.新建User类
package com.test.cyw; public class User {
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isSex() {
return sex;
}
public void setSex(boolean sex) {
this.sex = sex;
}
private String name;
private int age;
private boolean sex; }
2.新建useBean.jsp页面
在这个页面中将页面提交给自己,判断是否是post提交,如果是则实例化一个User对象,然后从request中获取值给user对象赋值,最后获取值。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="useBean.jsp" method="post">
<table>
<tr><td>姓名:</td><td><input type="text" name="name" value="" style="width:200"/></td></tr>
<tr><td>年龄:</td><td><input type="text" name="age" value="" style="width:200"/></td></tr>
<tr><td>性别:</td><td><input type="radio" name="sex" value="True" checked="true" />男<input type="radio" name="False" value="0" />女</td></tr>
<tr><td clospan="2"><input type="submit" name="submit" value="提交"/></td></tr>
</table>
</form>
<%
request.setCharacterEncoding("UTF-8");
if(request.getMethod().toString().equalsIgnoreCase("post")){%>
<!-- 在page中实例化一个id为user类型为com.test.cyw.User的对象 -->
<jsp:useBean id="user" class="com.test.cyw.User" scope="page"></jsp:useBean>
<!-- 设置use对象的各个属性,*代表所有,会自动从request中找 -->
<jsp:setProperty property="*" name="user"/>
姓名:<jsp:getProperty property="name" name="user"/><br>
年龄:<jsp:getProperty property="age" name="user"/><br>
性别:<jsp:getProperty property="sex" name="user"/><br>
<%
}
%>
</body>
</html>
实验二、scope实现计数器
上面列了scope的作用范围,这个demo主要是对scope的使用。利用它的作用域不同可以实现计数器功能。当scope为session时统计该用户的访问次数,使用application时统计该网站的访问次数。使用两个浏览器来刷新,不然两个的数量是相等的。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="com.test.cyw.Person" errorPage="/error.jsp"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<jsp:useBean id="sessionCounter" class="com.test.cyw.Counter" scope="session"></jsp:useBean>
<jsp:useBean id="applicationCounter" class="com.test.cyw.Counter" scope="application"></jsp:useBean>
个人访问次数:<jsp:getProperty property="count" name="sessionCounter"/><br>
总访问次数:<jsp:getProperty property="count" name="applicationCounter"/><br>
</body>
</html>
3.<jsp:forward/>行为
.<jsp:forward/>行为是对request.getRequestDispatcher()的封装,使用它也可以实现页面挑战,也可以添加参数
<jsp:forward page="test.jsp">
<jsp:param value="qaz" name="name"/>
</jsp:forward>
四、JSP隐藏对象
jsp中有9大隐藏对象,隐藏就是默认存在,可以直接使用1.out输出流对象
隐藏对象out是javax.servlet.jsp.JspWriter类的实例。服务器向客户端输出的字符类内容可以通过out对象输出。
2.request 请求对象
隐藏对象request是javax.servlet.ServletRequest类的实例。代表客户端的请求。request包含客户端的信息以及请求的信息,如请求哪个文件,附带的地址栏参数等。每次客户端请求都会产生一个request实例。
3.response 响应对象
隐藏对象response是javax.servlet.ServletResponse类的实例,代表服务器端的响应。服务器端的任何输出都是通过response对象发送到客户端浏览器。每次服务器端都会产生一个response实例。
4.config 配置对象
隐藏对象config是javax.servlet.ServletConfig类的实例,ServletConfig封装了配置在web.xml中初始化JSP的参数。JSP中通过config获取这些参数。每个JSP文件都有一个config对象。
5.session 会话对象
隐藏对象session是javax.servlet.http.HttpSession类的实例。session与cookie是记录客户访问信息的两种机制,session用于服务器端保存用户信息,cookie用于客户端保存用户信息。
Servlet通过request.getSession()获取session对象,而在JSP中可以直接使用。如果JSP中配置了<%@ page session="false" %>,则隐藏对象session不可用。每个用户对应一个session对象。
6.application 应用程序对象
隐藏对象application是javax.servlet.ServletContext类的对象。application封装了JSP所在的Web应用程序的信息,例如web.xml中配置的全局的初始化信息。Servlet中application对象通过ServletConfig.getServletContext()来获取。整个Web应用程序对应一个application对象。
7.page 页面对象
隐藏对象page为javax.servlet.jsp.HttpJspPage类的实例,page对象代表当前JSP页面,是当前JSP编译后的Servlet类的对象。page相当于普通java类中的关键字this。
8.pageContext 页面上下文对象
隐藏对象pageContext为javax.servlet.jsp.PageContext类的实例。pageContext对象代表当前JSP页面编译后的内容。通过pageContext能够获取到JSP中的资源。
9.exception 异常对象
隐藏对象exception为java.lang.Exception类的对象。exception封装了JSP中抛出的异常信息。要使用exception对象,需要设置<%@ page isErrorPage="true" %>。隐藏对象exception通常被用来处理错误页面。
五、配置
配置和Servlet的一样,只是在将 <servlet-class>转换为<jsp-file>即可。
六、EL表达式
POJO是为了简便获取页面请求的参数而生的,EL则是为了方便获取对象或变量而生的,以往获取对象或者属性需要使用XXX().XXXX().XX()这种,如果树比较深那就需要一直调用方法,也是比较麻烦的事情,而有了EL这个就很好解决。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="useBean.jsp" method="post">
<table>
<tr><td>姓名:</td><td><input type="text" name="name" value="" style="width:200"/></td></tr>
<tr><td>年龄:</td><td><input type="text" name="age" value="" style="width:200"/></td></tr>
<tr><td>性别:</td><td><input type="radio" name="sex" value="True" checked="true" />男<input type="radio" name="False" value="0" />女</td></tr>
<tr><td clospan="2"><input type="submit" name="submit" value="提交"/></td></tr>
</table>
</form>
<%
request.setCharacterEncoding("UTF-8");
if(request.getMethod().toString().equalsIgnoreCase("post")){%>
<!-- 在page中实例化一个id为user类型为com.test.cyw.User的对象 -->
<jsp:useBean id="user" class="com.test.cyw.User" scope="page"></jsp:useBean>
<!-- 设置use对象的各个属性,*代表所有,会自动从request中找 -->
<jsp:setProperty property="*" name="user"/>
姓名:<jsp:getProperty property="name" name="user"/><br>
年龄:<jsp:getProperty property="age" name="user"/><br>
性别:<jsp:getProperty property="sex" name="user"/><br>
姓名:${user.name}<br>
年龄:${user.age}<br>
性别:${user.sex}<br>
<%
}
%>
</body>
</html>
隐含对象名称 | 描 述 |
---|---|
pageContext | 对应于JSP页面中的pageContext对象(注意:取的是pageContext对象。) |
pageScope | 代表page域中用于保存属性的Map对象 |
requestScope | 代表request域中用于保存属性的Map对象 |
sessionScope | 代表session域中用于保存属性的Map对象 |
applicationScope | 代表application域中用于保存属性的Map对象 |
param | 表示一个保存了所有请求参数的Map对象 |
paramValues | 表示一个保存了所有请求参数的Map对象,它对于某个请求参数,返回的是一个string[] |
header | 表示一个保存了所有http请求头字段的Map对象 |
headerValues | 同上,返回string[]数组。注意:如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”] |
cookie | 表示一个保存了所有cookie的Map对象 |
initParam | 表示一个保存了所有web应用初始化参数的map对象 |
JavaWeb之JSP技术总结的更多相关文章
- JavaWeb:JSP技术基础
JavaWeb:JSP技术 快速开始 介绍 JSP全称Java Server Pages,是一种动态网页开发技术.它使用JSP标签在HTML网页中插入Java代码.标签通常以<%开头以%> ...
- Java Web之JSP技术
JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术.JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比htm ...
- Java匹马行天下之JavaWeb核心技术——JSP
JSP动态网页技术 一.JavaWeb简介 一.什么是JavaWeb? JavaWeb是用Java技术来解决相关web互联网领域的技术总称. 需要在特定的web服务器上运行,分为web服务器和web客 ...
- (八)JSP 技术知识点总结(来自那些年的笔记)
目录 什么是 jsp Jsp 调用和运行原理(简略版) Jsp语法 Jsp指令简介 Page指令 Include指令 taglib指令 Jsp乱码问题 jsp运行原理(详细版) JSP中的九大隐式对象 ...
- java的JSP技术
java的JSP技术 [toc] 1.JSP简介 Jsp技术是用来开发java web的页面显示的,所有MVC模型里面的视图层,所以视图层的开发 jsp不是编程语言,三个英文是java server ...
- Servlet,jsp,JSP技术 ,JSP编程
一.Servlet 思考 1 浏览器可以直接打开JAVA/class文件吗? 不可以 2浏览器可以打开HTML.JS 文件吗? 可以 3 JAVA程序可以生成HTML文件吗?可以的,用IO流. 4 ...
- JavaWeb chapter9 JSP基础
1. Servlet的缺陷 一个动态网页中,大部分内容都是HTML代码等固定不变的内容,编写和修改HTML非常不方便,令人厌恶: 部署Servlet是繁琐而且容易出错的任务:(Servlet3.0规 ...
- Jsp技术总结
这节我们总结一下Jsp的相关技术. 1. 什么是JSP JSP即Java Server Pages,它和servlet技术一样,都是sun公司定义的一种用于开发动态web资源的技术.该技术的最大特点在 ...
- JSP技术
1. JSP技术简介 JSP全称是Java Server Pages,它和servlet技术一样,都是SUN公司定义的一种用于开发动态web资源的技术.是sun公司定义的一种规范,JSP实际上就是Se ...
随机推荐
- CSS 文件的4种引入方式
(1)链接式 : 在网页的<head></head>标签对中使用<link>标记来引入外部样式表文件,使用html规则引入外部css (用得比较多) : < ...
- W3Cschool学习笔记——XHTML基础教程
XHTML 是更严格更纯净的 HTML 代码. XHTML 是什么? XHTML 指可扩展超文本标签语言(EXtensible HyperText Markup Language). XHTML 的目 ...
- Salesforce的Auto Number
在Salesforce中新建Object的时候,可以对Name选择Auto Number,即自动编号.如果没有仔细阅读说明的话,会有一个很容易让人迷惑的地方. 在选择时候,Salesforce提供的示 ...
- Javascript前端面试题
在网上看到了一些Javascript的面试题就整理了下来,后续看到再继续补充. 面试题按类型来分,主要涉及到"技术"与"非技术"两大类,技术类别下涉及到的子类别 ...
- didReceiveMemoryWarning-内存警告处理方法-iOS
前言 当app出现内存警告的时候会怎么办 正文 ios6.0之后,内存警告的viewDidUnload 被屏蔽,即又回到了ios3.0的时期的内存管理方式. iOS6.0及以上版本的内存警告:调用di ...
- python - bilibili(二)出错的解决办法
在获取房间号之前我们先解决上篇文章遗留的bug,即输入的房间号不是数字和对应的房间号不存在而产生的问题. 输入的房间号不是数字: 在python中,你所输入的必定是字符串,虽然你输入的是数字,但是类型 ...
- use vue vuex vue-router, not use webpack
vue,vuex,vue-router放在一起能做什么?不用webpack之类的打包工具使用他们是否可行?各位道友在初学vue时是否有这样的困惑.因为现代构建前端项目的一般模式是: 安装webapck ...
- html5中的meta标签
1. <meta http-equiv="X-UA-Compatible" content="IE=edge" /> IE=edge告诉IE使用最新 ...
- 安装和配置Symfony
为了简化创建新项目的过程,Symfony提供一个安装程序. 安装Symfony Installer 使用Symfony Installer是创建新的Symfony项目的唯一推荐方式,这个install ...
- JavaScript 毒瘤和糟粕(需要注意的地方)
简介 我想这是在我总结JavaScript系列中最为需要注意的,最为重要的内容.你必须要去了解这些问题特性,才能准备好应对措施,这真的很重要. 毒瘤 全局变量 全局变量的存在的确是带来了方便,但是我觉 ...