一.web的简单了解
1.web分类
* 静态web 不可以动态更新 数据没有持久化即没有和数据库进行交互,所以每个人看到的页面都是同一个
* 静态Web的组成 轮播图,JavaScript,VBScript 以及一些特效
* 假如web服务器发生错误 即需要停服维修
* 动态web 可以动态更新 数据持久化即和数据库进行交互,所以每个人看到的页面都是不同的
* 动态Web的组成 ASP(微软的,C#)在html中加入VB代码 代码乱不易维护
* PHP(WP) 开发速度快 跨平台 代码简单 无法承载大访问量
* JSP/Servlet(sun) 基于Java语言 可承载三高问题 语法像ASP
2.tomcat 的目录
* bin 用来启动关闭tomcat
* conf tomcat的一些配置
* log 日志文件
* webapps 部署网站
3.消息头
* Accept 告诉浏览器 它所支持的数据类型
* Accept——Language 语言环境
* Cache-Control 缓存控制
* Connection 是请求完成还是断开连接
4.Servlet
sun公司开发动态web的一个技术
* sun公司在API中提供一个接口叫Servlet,如果想要开发Servlet程序
* 1.实现servlet
* 2.把开发好的项目部署到web服务器
5.maven中的子父工程
* 父工程中含有
* <modules>
* <module>start</module>
* </modules>
* 子工程中含有
* <parent>
* <artifactId>Web</artifactId>
* <groupId>org.example</groupId>
* <version> 1.0-SNAPSHOT</version>
* </parent>
* 子工程中继承父工程的所有依赖
6.servlet 的请求路径
<!--我们写的java程序需要通过浏览器访问所以我们要把路径写道我们自己写的Java类当中1.要注册Servlet 2.要给一个访问路径 -->
<!-- 注册servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.remained.HelloServlet</servlet-class>
</servlet>
<!-- servlet 的请求路径-->
<!-- servlet 对应的映射路径 可以是一对多 即一个servlet 可以对应多个路径 而且还可以使用通配符/* 或/*.text
有优先级 确定的路径>通配符所表示的路径即会进入确定路经下的servlet
默认请求路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
7. 响应状态码
200 请求响应成功
3XX 请求重定向
4XX 找不到资源
5XX 服务器代码错误
二.一些重要的参数
1.ServletContext
是一个域对象(用来存取数据)
可以读取全局配置参数
可以搜索当前工程目录下面的资源文件
可以获取当前工程名字(了解)
//加上注解就不用去mapping配置映射
@WebServlet("/hello1")
public class ContextTe extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//接收HelloServlet 中的context的值
ServletContext context = this.getServletContext();
//设置编码以及类型 不设置 可能会出现乱码
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
//因为知道是字符串 所以强转一下 默认返回的是object
String userName =(String) context.getAttribute("userName");
//注意 要先运行hello才能存入数据
//null 的原因 1.没有运行hello 直接运行的这个 2.接收参数的值和设置参数的值不一样 3.context没设置好
//把HelloServlet中的userName的值接收过来 并打印在页面上
resp.getWriter().println(userName);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
2.Request
web服务器端接收客户端发出的Http的请求,会创建一个代表请求 HttpServletRequest,和一个代表响应的HttpServletResponse 获取请求中的参数 HttpServletRequest 给客户端响应一些信息 HttpServletResponse HttpServletRequest 代表客户端的请求,用户通过http协议访问服务器,Http请求的所有信息会被封装到HttpServletRequest, 通过这个类可以获取客户端的信息(即get...方法) HttpServletRequest中获取请求行信息 HttpServletRequest中获取请求头 1.获取前端传递的参数 HttpServletRequest提供的锦上添花的方法,HttpServletRequest最重要的就是可以获取用户提交来的数据,比如表单数据或者一些查询参数。因为Servlet在MVC架构中是充当controller这个角色的,其负责响应用户的请求,也就需要和用户进行交互, 2.负责获取从前端(JSP,客户端)获取数据(用户输入、或者查询条件等),并在处理结束后,给客户端一个响应。如果无法获取页面数据,那么后续的操作也就无从谈起。 java.lang.String getParameter(java.lang.String s); java.lang.String[] getParameterValues(java.lang.String s);
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
///获取form表单中提交的数据
String user = req.getParameter("user1");
String pwd = req.getParameter("pwd1");
//字符不是字节 getWriter()
//前后端的post或get要一致 小心405
resp.getWriter().println(pwd);
System.out.println(pwd);
}
form表单中的数据
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>测试</title>
</head>
<body>
<form action="/request" method="get">
用户名:<input type="text" name="user1">
登录:<input type="text" name="pwd1">
<input type="submit">
</form>
</body>
</html>
3.Response
HttpServletResponse 的一些方法 负责给浏览器发送数据的方法即响应, 所以是 resp中的方法 java.io.PrintWriter getWriter() throws java.io.IOException; javax.servlet.ServletOutputStream getOutputStream() throws java.io.IOException; 负责向浏览器发送响应头的方法
HttpServletResponse常见的应用 输出消息 下载文件
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
FileInputStream fis = null;
ServletOutputStream sos = null;
try {
//下载文件
//1.获取下载文件的路径 绝对路径(注意部署Tomcat时的项目名)
String path = "E:\\Web\\start\\src\\main\\webapp\\img\\2.jpg";
//2.下载的文件名
String fileName = path.substring(path.lastIndexOf("\\")+1);
//3.设置想办法让浏览器能够支持我们所下载的东西 "Content-Disposition","attachment;filename="
//URLEncoder.encode(fileName,"UTF-8")设置该文件名的编码方式 导入的包是import java.net.URLEncoder;
resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));
//4.获取下载文件的输入流
//5.将文件的输入通过ServletOutputStream输出给客户端
fis = new FileInputStream(path);
int len;
byte[] bt = new byte[1024];
sos = resp.getOutputStream();
while((len=fis.read(bt))!=-1){
sos.write(bt,0,len);
}
//6.流的关闭
} catch (IOException e) {
e.printStackTrace();
} finally {
if (sos != null) {
try {
sos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
4.Cookie
会话:打开浏览器的各个web资源,到关闭浏览器结束。 引入:HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话 cookie:Cookie通过在客户端记录信息确定用户身份 通过request.getCookie()获取客户端提交的所有Cookie(以Cookie[]数组形式返回), 通过response.addCookie(Cookiecookie)向客户端设置Cookie。 Cookie具有不可跨域名性即通过域名判断携带那个cookie Cookie的有效期 Cookie的maxAge决定着Cookie的有效期,单位为秒 删除cookie时只需要把maxAge修改为0即可 Cookie对象使用key-value属性对的形式保存用户状态,一个Cookie对象保存一个属性对, 一个cookie多个值 取第一个 一个request或者response同时使用多个Cookie。因为Cookie类位于包javax.servlet.http.*下面,所以JSP中不需要import该类
public class CookieTe extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*
* 编码和解码问题
* URLEncoder.encode("李","utf-8");
URLEncoder.encode("李","utf-8");
* */
/*删除cookie
* 1.不设置有效时间,关闭浏览器自动失效
* 2.有效时间设置为0 */
//解决中文乱码问题
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
//服务端从客户端获取cookie
Cookie[] cookies = req.getCookies();
//判断cookie是否存在
if (cookies != null) {
for (int i = 0; i <cookies.length ; i++) {
//cookie是键值对,所以要获取它的值
out.println(cookies[i].getValue());
}
}else {
out.write("你第一次访问本站");
}
//存一个cookie
Cookie cookie = new Cookie("success","remained");
//添加进去
resp.addCookie(cookie);
//有效期为一天
cookie.setMaxAge(24*60*60);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
5.Session
session:Session通过在服务器端记录信息确定用户身份 增加了服务器的存储压力 Session保存在服务器上 Session对象是在客户端第一次请求服务器的时候创建的。Session也是一种key-value的属性对, 通过getAttribute(Stringkey)和setAttribute(String key,Objectvalue)方法读写客户状态信息。 Servlet里通过request.getSession()方法获取该客户的Session 各客户的Session也彼此独立,互不可见 为了获得更高的存取速度,服务器一般把Session放在内存里。每个用户都会有一个独立的Session 如果超过了超时时间没访问过服务器,Session就自动失效了 maxInactiveInterval属性 服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为该Session的id。Session依据 该 Cookie来识别是否为同一用户。 区别 cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用cookie。 两者最大的区别在于生存周期,一个是IE启动到IE关闭.(浏览器页面一关 ,session就消失了),一个是预先设置的生存周期,或永久的保存于本地的文件。(cookie)
public class SessionTe extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//得到session
HttpSession session = req.getSession();
//得到都是请求
//在session中存数据
session.setAttribute("name","remained");
//获取sessionId
String id = session.getId();
//输出sessionId
resp.getWriter().println(id);
//输出存进session的数据
resp.getWriter().println(session.getAttribute("name"));
//手动注销session
//session.invalidate();
/* <session-config>
<!-- 设置session的默认失效时间,15分钟后session自动失效,以分钟为单位-->
<session-timeout>15</session-timeout>
</session-config>*/
/*
session第一次创建
Cookie cookie = new Cookie("JSessionId","long");
resp.addCookie();
*/
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
6.forward
服务器行为
地址上显示的还是转发之前的地址,不会变。 请求次数只有一次, 因为是服务器内部帮客户端执行了后续的工作。 只能跳转自己项目的资源路径 。 效率上稍微高一点,因为只执行一次请求。 请求转发可以将请求域中的数据带到目标页面(因为使用的始终是同一个request对象,对客户端来说只发了一次请求,那就只有一个request对象)
7.redirect
客户端行为
地址上显示的是最后的那个资源的路径地址 请求次数最少有两次, 服务器在第一次请求后,会返回302 以及一个地址(Location), 浏览器在根据这个地址,执行第二次访问。 可以跳转到任意路径。不是自己的工程下的路径也可以跳。 效率稍微低一点 执行两次请求。 重定向无法将请求域中的数据带到目标页面(没法使用上一次的request对象,因为这是两次不同的请求)
@WebServlet("/rt")
public class RedirectTransmit extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重定向
// String user = req.getParameter("user");
// String pwd = req.getParameter("pwd");
// System.out.println(user+"\n"+pwd);
// resp.sendRedirect("success.jsp");
// 请求转发
RequestDispatcher rd= req.getRequestDispatcher("success.jsp");
rd.forward(req,resp);
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<%--${pageContext.request.contextPath} 路径前表示当前项目--%>
<form action="/rt">
用户名:<input type="text" name="user">
登录:<input type="text" name="pwd">
<input type="submit">
</form>
</body>
</html>
三.JSP知识
1.相关概念
Java Server Page:Java服务器端页面也和Servlet一样,用于动态Web 特点:写jsp就像在写html jsp可以嵌入java代码 原理:其继承的父类继承了Servlet jsp最终会转换为成一个java类 jsp类的三个方法 jspInit jspDestroy jspService(request,response)(jsp的东西主要被写进这个方法里)
2.三种注释
HTML注释:<!--HTML注释--> HTML注释会被翻译到JSP文件对应的Java类的_jspService方法中,以out.write()输出到客户端, write方法会自动识别标签,执行标签对应的功能,不会在浏览器的页面上输出注释 Java注释:(1) //单行注释 (2) /*多行注释*/ Java注释要写在声明脚本和代码脚本中才被认为是Java注释,会被翻译到JSP文件对应的Java类的_jspService方法中,在对应的Java类中也是注释 JSP注释:<%- -这是JSP注释- -%> JSP注释中的内容不会在JSP文件翻译后的Java类中出现,即注释中的内容没有任何功能
3.jsp表达式
=后面可以是变量或者表达式
<%= new java.util.Date()%>
4.jsp脚本片段
里面可以嵌套html代码 即for循环分成两个脚本片段输出(实质就是在源码里面不在<%%>里面的会做一些处理)
<%
for (int i = 0; i <5 ; i++) {
out.println(i);
}
%>
5.jsp声明
就是放在类全局中 而不是上面的jspService方法中
<%! public int i=1;
static {
System.out.println("ss");
}
%>
6.jsp语法
JSP头部的page指令可以修改JSP页面中的一些重要属性或行为
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
(以下属性均写在page指令中,默认page指令中没有出现的属性都采用默认值): (1) contentType属性:表示JSP返回的数据类型是什么,即response.setContentType()的参数值 (2) language属性:表示JSP翻译之后是什么语言文件(目前只支持Java) (3) pageEncoding属性:表示当前JSP文件本身的字符集(可在IDEA右下角看到) (4) import属性:表示导包(导类),与Java一致 (5) autoFlush属性:设置当out输出流缓冲区满了之后是否自动刷新缓冲区,默认值是true (6) buffer属性:设置out缓冲区的大小,默认是8kb 注意:out缓冲区满了之后不能自动刷新的话会报错 (7) errorPage属性:设置当JSP页面运行出错时自动跳转到的页面(错误信息页面)的路径(也可以在web.xml中设置全局的) (8) isErrorPage属性:设置当前JSP页面是否是错误信息页面,默认是false,如果是true可以 获取错误信息 (9) session属性:设置访问当前JSP页面时是否会创建HttpSession对象,默认值是true (10) extends属性:设置JSP页面翻译出来的Java类默认继承谁 注意:以上默认值除非有特殊需要,否则不建议修改
7.jsp常用标签
<%-- 将两个页面合二为一--%>
<%@include file="header.jsp"%>
<h1>中间</h1>
<%@include file="footer.jsp"%>
<%--实际上还是不同的页面--%>
<jsp:include page="header.jsp"/>
8.九大内置对象(已经定义好了,直接可以使用)
request:请求对象 (存数据) response:响应对象 pageContext:JSP的上下文对象(存数据) session:会话对象 (存数据) application:ServletContext对象 (存数据) config:ServletConfig对象 out:JSP输出流对象 page:指向当前JSP的对象 exception:异常对象
9.四大域对象
page范围 pageContext:只是在一个页面中保存属性,跳转之后无效 request范围 request:只在一次请求中保存,服务器跳转后依然有效(最常用) 新闻 session范围 session:在一次会话范围中,无论何种跳转都有效 购物车 application范围 application:在整个服务器中保存,关闭后失效 聊天数据
<%-- 存--%>
<%
pageContext.setAttribute("name","remained1");
request.setAttribute("name","remained2");
session.setAttribute("name","remained3");
application.setAttribute("name","remained4");
%>
<%-- 取 取的时候从低到高的顺序--%>
<%
String name1 =(String) pageContext.findAttribute("name");
String name2 =(String) pageContext.findAttribute("name");
String name3 =(String) pageContext.findAttribute("name");
String name4 =(String) pageContext.findAttribute("name");
%>
<%--Java输出--%>
<%
out.print(name1);
%>
<%--el表达式输出--%>
${name}
10.页面输出
(1) out.print():会将任何内容转换成字符串后调用write方法输出 (2) out.write():输出字符串没有问题,但输出int型时会将int转换成char输出,导致输出的并非是想要的数字而是数字对应的ASCII码
11.其它注意
scope作用域 四大域对象 从低到高 分别为1-4
请求转发 相当于 request.getRequestDispatcher("header.jsp").forward(request,response);
<%
pageContext.forward("header.jsp");
%>
请求转发携带参数
<jsp:forward page="header.jsp">
<jsp:param name="test" value="remainedYou"/>
</jsp:forward>
el表达式原样输出可能是Servlet/JSP 的版本有关
<%@ page isELIgnored=“false” %> 才可以
四.JSTL标签
1.引入
用来提升在JSP页面的逻辑代码的编码效率,使用标签来替换逻辑代码的直接书写
2.使用步骤
1.引入对应的taglib <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
2.使用其中的方法
3.标签库分类
核心标签库(重点)
格式化标签库
SQL标签库
函数标签库
XML标签库
4.核心标签库
IF标签
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>if标签</title>
</head>
<body>
<%--if标签的test属性必须是一个boolean类型的值,如果test的值为true,那么执行if标签的内容,否则不执行。--%>
<c:set var="a" value="hello"/>
<%--注意比较时实在{}里面--%>
<%--<c:if test="" var="一个变量(值为test中所判断的true或false)" scope="作用域"> </c:if>--%>
<c:if test="${a=='hello'}">
hello,word
</c:if>
<c:if test="true">
<c:out value="success"/>
</c:if>
</body>
</html>
forEach标签
<%@ page import="java.util.LinkedHashMap" %>
<%@ page import="java.util.Map" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>forEach测试</title>
</head>
<body>
<%--<c:forEach var="取值所用的变量" items="所遍历的变量" begin="从第几个开始" --%>
<%-- end="到第几个结束" step="隔几个取值" varStatus="快捷取值"></c:forEach>--%>
<%--1到10的总和--%>
<c:set var="sum" value="0" />
<c:forEach var="i" begin="1" end="10">
<c:set var="sum" value="${sum + i}" />
</c:forEach>
<c:out value="sum = ${sum }"/>
<br>
<%--用forEach取值--%>
<%
Map<String,String> stu = new LinkedHashMap<String,String>();
stu.put("number", "N_1001");
stu.put("name", "zhangSan");
stu.put("age", "23");
stu.put("sex", "male");
application.setAttribute("stu",stu);
%>
<c:forEach var="item" items="${stu }">
<c:out value="${item.key }: ${item.value }"/><br/>
</c:forEach>
<hr>
<%--varStatus用法--%>
<%--count:int类型,当前以遍历元素的个数;
index:int类型,当前元素的下标;
first:boolean类型,是否为第一个元素;
last:boolean类型,是否为最后一个元素;
current:Object类型,表示当前项目--%>
<c:forEach var="item" items="${stu }" varStatus="vs">
<c:if test="${vs.first }">第一行:</c:if>
<c:if test="${vs.last }">最后一行:</c:if>
<c:out value="第${vs.count }行: "/>
<c:out value="[${vs.index }]: "/>
<c:out value="name: ${vs.current }"/><br/>
</c:forEach>
<%--结果--%>
第一行: 第1行: [0]: name: number=N_1001
第2行: [1]: name: name=zhangSan
第3行: [2]: name: age=23
最后一行: 第4行: [3]: name: sex=male
<%--没有current的结果--%>
第一行: 第1行: [0]:
第2行: [1]:
第3行: [2]:
最后一行: 第4行: [3]:
第一行: 第1行: [0]: name: number=N_1001 第2行: [1]: name: name=zhangSan 第3行: [2]: name: age=23 最后一行: 第4行: [3]: name: sex=male
</body>
</html>
setout标签
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>SetOut测试</title>
</head>
<body>
<%-- <c:set var=”a” value=”hello”/> 在pageContext中添加name为a,value为hello的数据。
<c:set var=”a” value=”hello” scope=”四大作用域”/>
<%--默认输出的为没有scope(范围)参数的--%>
<c:set var="a" value="hello,application" scope="request"/>
<c:set var="a" value="hello,a"/>
${a}
<%--默认输出的为没有scope(范围)参数的--%>
<br>
<c:out value="${a}"/>
<c:out value="${aa}"/> 没有该参数 不进行输出
<c:out value="sss"/>
<c:out value="${aa}" default="ss"/> 没有该参数 则输出ss
</body>
</html>
JavaBean
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
实体类
写法:一个无参构造器,属性私有化,有对应的get,set方法(书写规范化)
用途:一般用来和数据库的字段做映射ORM(对象关系映射即表-类,字段-属性,一行字段-对象)
<br>
<%-- 存 Person 是已经创建好的JavaBean--%>
<jsp:useBean id="person" class="Person" scope="application"/>
<jsp:setProperty name="person" property="name" value="remained"/>
<jsp:setProperty name="person" property="age" value="1"/>
<%-- 取--%>
姓名:<jsp:getProperty name="person" property="name"/>
年龄:<jsp:getProperty name="person" property="age"/>
</body>
</html>
remove
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>remove标签测试</title>
</head>
<body>
<%--remove 移除数据--%>
<%--<c:remove var="变量名" scope="指定消除那个作用域中的数据"/>--%>
<c:set var="a" value="俺是a"/>
${a}
<c:remove var="a"/>
${a}
<%
application.setAttribute("c","这是value");
%>
${c}
${applicationScope.c}
</body>
</html>
五.EL表达式
1.概念
Expression Language表达式语言 在JSP2.0开始引入概念
2.从四大域中获取属性
如果没有使用EL的内置对象,则查找数据顺序是依次按照由小到大范围从四大域中查找指定名称的属性值
3.EL的内置对象
用法 ${内置对象.key} pageScope requestScope sessionScope applicationScope 从各个对应的域中找对应的key 并输出其对应的value pageContext 该pageContext与JSP内置对象pageContext是同一个对象。通过该对象, 可以获取到request、response、session、servletContext、servletConfig等对象 注意:这些对象在EL里不是内置对象,这些对象只能通过pageContext获取 常用的:${pageContext.request.contextPath },代表web应用下的根 param(获取请求中的指定参数) 其底层实际调用request.getParameter() 如form表单中的参数传递到另一个页面 接收时${param.name}即可获取 paramValues 获取多个值,其底层实际调用request.getParameterValues() initParam(在web.xml中设置) 获取初始化参数,其底层调用的是ServletContext.getInitParameter()
4.获取JavaBean
<% 创建其对象并报存在域中 %> ${对象名.属性} 即可获取其属性
5.获取数组等存多个值的对象
${存的对象名[下标]} set没有索引,无法访问 map时${存的对象名.key}获取的是其value
6.其他
不支持++ ${empty 变量} 有此变量为true,反之false 是一种在JSP页面获取数据的简单方式(只能获取数据,不能设置数据)
六.遇到的一些关于JSTL的麻烦
java.lang.ClassNotFoundException: org.apache.jsp._6_jsp
org.apache.taglibs.standard.tlv.JstlCoreTLV
java.lang.NoClassDefFoundError
用jstl的核心标签老出错,上网查了些资料,1.2之前的版本需要依赖standard.jar包,并且引入的标签也不一样,还有就是Servlet版本和JSTL 的版本冲突。
这是能用的依赖,然后把standard-1.1.2.jar,jstl-api-1.2.jar,jstl-1.2.jar放进了Tomcat的lib下,就好了。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<dependencies>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl-api -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>