一.简介
JSP语言:它是在servlet发展起来的,更加方便,它是HTML,java代码,JSP自己的东西所组成的,英文缩写是java server pages。
在jsp文件中,我们可以在java代码之间插入html代码,也可以在html代码之中插入java代码
html中插入java:
第一种:<%=java%>这是一个输出的语句,里面的内容直接输出,注意不要写分号。
第二种:<%java%>在这里面我们就可以写一些java代码,for循环之类的。
java中插入html:
%>html<%
以前我们在HTML文件中写页面,现在就可以在JSP中写页面了
二.JSP注释
JSP中可以有java,html,和自己的JSP语言,当然它的注释也有三种
1.HTML注释:<!--注释-->
2.java注释://注释 或 /*注释*/ 或 /** 注释*/
3.JSP注释: <%--注释--%>
例:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 我是html注释 -->
<%--我是JSP注释 --%>
<%
//我是java注释
/*
我是java多行注释
*/
%>
</body>
</html>
三.JSP指令
1.page指令(可以出现多个page指令)
写法:<%@ page 属性名称=属性值%>
属性:红色为重点
language 目前没什么用,现在只能翻译java语言(上面的代码中已经应用了这个属性)
extends 继承,没有什么用,不用修改
session 默认为true,可以直接用session这个对象
import 导入包
buffer 设置缓冲区大小,默认为8KB
autoflush 如果缓冲区满了,是否自动刷新,默认为自动刷新,如果不自动刷新,则抛出异常
errorpage 程序抛出异常,直接抛到指定的错误页面
iserrorpage 在错误页面使用的属性,决定是否可以直接使用exception,默认是可以的
isELIgnored 是否忽略EL表达式,默认为false,不忽略
pageEncoding 指定当前页面的编码(上面的代码中已经应用了这个属性)
contentType 浏览器默认打开文件时的编码(上面的代码中已经应用了这个属性)
例1:
<%@ page import="java.util.*"%>
<%@ page buffer="10kb"%>
<%@ page autoflush="true"%>
<%@ page iserrorpage="false"%>
<%@ page isELIgnored="false"%>
例2:errorpage
error.jsp发生错误的页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" errorPage="/JSP/500.jsp"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
int a=10/0;
%>
</body>
</html>
500.jsp跳转的页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<img src="/Demo3/image/7.jpg">
</body>
</html>
没有配置错误页面之前是:
配置之后:
还有一个更重要的配置全局错误页面的方法,就是在web.xml中配置,其实就是配置一下当发生什么错误的时候跳转,跳转页面的地址是哪里
<error-page>
<error-code>500</error-code>
<location>/JSP/500.jsp</location>
</error-page>
2.include指令:可能有很多网页的头部和尾部的HTML的页面是不变的,所以,我们就可以不用动它,直接写body的内容,然后把以前用过的头部和尾部用一句话加在里面,下面的演示一共有三个页面head.jsp body.jsp foot.jsp然后我再body.jsp中将头部和尾部引用进去,这种方式叫做静态包含。
head.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h5>我是head</h5>
</body>
</html>
foot.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h5>我是foot</h5>
</body>
</html>
body.jsp
<%@ include file="/include/head.jsp" %>是引用的方式,注意一下顺序
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%@ include file="/include/head.jsp" %>
<h5>我是body</h5>
<%@ include file="/include/foot.jsp" %>
</body>
</html>
四.JSP内置对象(这些对象可以直接使用)
1.request对应HttpServletRequest,页面来的请求
2.response对应HttpServletResponse,服务器的回应
3.session对应HttpSession
4.application对应ServletContext,服务器的全域对象
5.out对应Jspwriter,可以向页面输出一些内容
6.pagecontext对应pagecontext
这是最重要的一个内置对象,通过它可以获取另外的内置对象,它同时也是一个域对象,代表当前页面的域
比如:pageContext.request.getparameter();
它的方法:
setAttribute(name,value)以键值对的形式设置名字和值
setAttribute(name,value,scope)scope代表域,可以在指定的域中设定,比如:PageContext.PAGE_SCOPE当前页面的 域
getAttribute(name)通过名字获取值
getAttribute(name,scope)在指定域中获取值
findAttribute(name)全域查找,从最小的域开始找,如果找不到将域扩大
page对应this
8.config对应ServletConfig
五.JSP动作标签
1.<jsp:forward>转发(转发就是在一个项目的内部进行跳转)
1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>原网站</h1>
<jsp:forward page="/forward/2.jsp"></jsp:forward>
</body>
</html>
2.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>转发的网站</h1>
</body>
</html>
结果:我们可以发现我们访问的是1.jsp,然后跳转到了2.jsp,然后上面的访问地址却还是1.jsp,这就是转发的特点之一
2.<jsp:param>转发时的传递参数,写在转发标签之内,我们直接写例子体会一下,获取1.jsp的参数,在2.jsp中获取并输出到页面之中。
1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>原网站</h1>
<jsp:forward page="/forward/2.jsp">
<jsp:param value="50" name="price"/>
</jsp:forward>
</body>
</html>
2.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>转发的网站</h1>
<%
String a=request.getParameter("price");
out.print(a);
%>
</body>
</html>
结果:
3.<jsp:include page="url"></jsp:include>动态包含页面,功能和前面的静态包含是相同的
六.BeanUtils
把jsp页面提交过来的表单提交到servlet中,用BeanUtils进行封装,需要注意的是,下面封装数据中的username,password,必须和jsp页面中name中的username,password是一样的,才能利用BeanUtils完成数据的封装。
首先得有一个jsp页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/Demo3/BeanLogin" method="post">
姓名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
然后创建一个user类进行封装数据
package cn.itcast.servlet;
public class User {
private String username;
private String password;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
最后创建一个名字为BeanLogin 的servlet程序:
package cn.itcast.servlet;
import java.io.IOException;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.BeanUtils;
/**
* Servlet implementation class BeanLogin
*/
@WebServlet("/BeanLogin")
public class BeanLogin extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public BeanLogin() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
//首先获取数据
Map<String,String[]> map=request.getParameterMap();
//创建一个可以封装数据的具体对象
User user=new User();
try {
//将具体的封装数据的对象和获取的数据联系起来
BeanUtils.populate(user, map);
}
catch(Exception e){
e.printStackTrace();
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
七.EL表达式
1.从域对象中获取属性值
${ username }从域中获取属性名字为username的值,默认从最小的域中获取
${ requestScope.username }从指定的域中获取属性名字为username的值
${ arrs[0] }这里的arrs为数组的名字,功能是从指定的数组中获取值,里面的0代表第一个位置,也就是序号
$( map.key)从map集合中获取值,map为名字,key为关键字
2.在表达式中执行一些运算
$( a+b )获取a+b的值
$(a==b)判断a和b是否相等
等等,有很多类似运算符的操作
1和2的演示代码和结果:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
request.setAttribute("a", 10);
request.setAttribute("b", 10);
request.setAttribute("username", "demo");
String[] arrs=new String[]{"1","2","3"};
request.setAttribute("arrs", arrs);
Map<String,String> map=new HashMap<String,String>();
map.put("key","value");
request.setAttribute("map", map);
%>
${username}
${requestScope.username}
${arrs[0]}
${map.key}
${a+b}
${a==b}
</body>
</html>
3.提供了一些web对象可以直接使用
pageScope:当前页面的域
requestScope:请求的域
sessionScope:session的域
applicationScope:全局的域
例:${sessionScope.username}
param:获取表单过来的参数,相当于request.getParameter()
cookie:获取cookie对象
PageContent:通过它可以获取其他的对象
${PageContext.request}:获取request对象