Jsp
Java Server Pages, Java服务器页面。和Servlet一样,是一种动态网页开发技术。基于HTML模板。适用于页面展示。
脚本
<%-- 脚本--%>
<%
//局部变量,方法里面
int num =100;
String name = "小轩";
Date date = new Date();
List<String> list = new ArrayList<>();
list.add("西瓜");
list.add("苹果");
//输出
// out.write(num);
// out.write("<br/>");
// out.write(name);
// out.write("<br/>");
// out.write(date.toString());
// out.write("<br/>");
// out.write(list.toString());
%>
<%--脚本表达式--%>
<%=name%><br/>
<%=date%><br/>
<%=num%><br/>
<%=list%><br/>
<%--声明成员变量,方法,类里面--%>
<%!
//声明成员变量
private String name = "轩儿";
private int age = 20;
//声明方法
public String getName(){
return name;
}
%>
<%=name%><br/>
<%=age%><br/>
<%=getName()%><br/>
Jsp注释(java文件看不到,浏览器也看不到)
<%--jsp注释,是看不到的--%>
<%-- <%=name%><br/>--%>
<%-- <%=age%><br/>--%>
<%-- <%=getName()%><br/>--%>
<%-- <p>我爱Java,Java爱我</p>--%>
根目录是以端口号为起点。
Jsp和Servlet的关系
Jsp工作原理
Jsp指令
page指令
pageEncoding是jsp翻译成java文件的编码格式。
Buffer=“8k”。设置缓冲
include
静态包含不会生成被包含的java文件。
<!--相对路径-->
<body>
<%@ include file="header.jsp"%>
<h2>这是中间</h2>
<%@include file="footer.jsp"%>
</body>
tablib指令
动作标签
生成了相应的java文件。
<body>
<jsp:include page="header.jsp"></jsp:include>
<h2>主界面</h2>
<jsp:include page="footer.jsp"></jsp:include>
</body>
class=""全限定名。
<body>
<jsp:useBean id="student" class="com.qf2002.Student"></jsp:useBean>
<jsp:setProperty name="student" property="address" value="北京"></jsp:setProperty>
<jsp:setProperty name="student" property="age" value="13"></jsp:setProperty>
<jsp:setProperty name="student" property="name" value="小轩"></jsp:setProperty>
<%=student.toString()%><br/>
<jsp:getProperty name="student" property="age"/><br/>
<jsp:getProperty name="student" property="name"/><br/>
Z jsp:getProperty name="student" property="address"/>
</body>
这个需要处理中文乱码问题,需要在当前页面设置request.setCharacterEncoding(“utf-8”);
<%
request.setCharacterEncoding("utf-8");
%>
<jsp:forward page="index2.jsp?username=小轩">
<jsp:param name="address" value="北京"/>
</jsp:forward>
内置对象
jsp翻译成java文件,生成了九个内置对象。
口诀:RRSACEOPP
out对象
out的类型是JspWriter,先输出到buffer缓冲区。
<body>
<h2>out输出</h2>
<%
out.print("苹果");
out.print("苹果");
out.print("西瓜");
response.getWriter().write("java是世界上最好的语言...");
%>
这样就会出一个问题。
所以
out.print("苹果");
out.print("苹果");
out.print("西瓜");
//刷新一下
out.flush();
response.getWriter().write("java是世界上最好的语言...");
pageContext对象(页面上下文)
作为域
//作为域
//设置数据
pageContext.setAttribute("username", "admin");
pageContext.setAttribute("password", "123");
//得到数据
out.print(pageContext.getAttribute("username"));
out.print(pageContext.getAttribute("password"));
//移出数据
pageContext.removeAttribute("username");
pageContext.removeAttribute("password");
对其他域对象进行操作
//2.操作其他三个域对象,request session application
pageContext.setAttribute("requestData", "小轩轩",PageContext.REQUEST_SCOPE);
pageContext.setAttribute("sessionData", "小明",PageContext.SESSION_SCOPE);
pageContext.setAttribute("applicationData", "小红",PageContext.APPLICATION_SCOPE);
//各自的域获取pageContext设置的各自的数据
String requestData = (String) request.getAttribute("requestData");
String sessionData = (String) session.getAttribute("sessionData");
String applicationData = (String) application.getAttribute("applicationData");
out.println(requestData);
out.println(sessionData);
out.println(applicationData);
//pageContext获取其他域的信息
out.print(pageContext.getAttribute("requestData",PageContext.REQUEST_SCOPE));
out.print(pageContext.getAttribute("sessionData",PageContext.SESSION_SCOPE));
out.print(pageContext.getAttribute("applicationData",PageContext.APPLICATION_SCOPE));
//findAttribute();从四个域中国查找满足条件的数据,pageContext-->request-->session-->application,找到就停止
String requestData1 = (String) pageContext.findAttribute("requestData");
String sessionData1 = (String) pageContext.findAttribute("sessionData");
String applicationData1 = (String) pageContext.findAttribute("applicationData");
out.print(requestData1);
out.print(sessionData1);
out.print(applicationData1);
//移除所有域中满足条件的数据 pageContext-->request-->session-->application
pageContext.removeAttribute("requestData");
//移出某个域中的数据
pageContext.removeAttribute("sessionData", PageContext.SESSION_SCOPE);
获取其他八个对象
public static void getAllObject(PageContext pageContext) {
//获取request对象
HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
//获取response对象
HttpServletResponse response = (HttpServletResponse) pageContext.getResponse();
//获取session对象
HttpSession session = pageContext.getSession();
//获取ServletContext对象
ServletContext application = pageContext.getServletContext();
//获取ServletConfig对象
ServletConfig cig = pageContext.getServletConfig();
//获取Exception对象
Exception exception = pageContext.getException();
//获取JspWriter对象
JspWriter out = pageContext.getOut();
//获取Servlet对象
Servlet page = (Servlet) pageContext.getPage();
}
四大域对象
EL表达式
如果只写域中的变量,不也属于哪个域的变量,就逐级查找
获取特定的域的值
requestScope, sessionScope, applicationScope
<%
pageContext.setAttribute("username", "小轩",PageContext.SESSION_SCOPE);
pageContext.setAttribute("password", "12345",PageContext.APPLICATION_SCOPE);
%>
${sessionScope.username}<br/>
${applicationScope.password}<br/>
EL表达式操作普通变量
<%
//向域中添加数据
pageContext.setAttribute("username", "小轩");
pageContext.setAttribute("password", "123");
pageContext.setAttribute("address", "北京",PageContext.REQUEST_SCOPE);
pageContext.setAttribute("email", "zhangsan@qq.com",PageContext.SESSION_SCOPE);
pageContext.setAttribute("age", "18",PageContext.SESSION_SCOPE);
%>
<%--不使用EL表达式--%>
<%=pageContext.findAttribute("username")%><br/>
<%=pageContext.findAttribute("password")%><br/>
<%=pageContext.findAttribute("address")%><br/>
<%=pageContext.findAttribute("email")%><br/>
<%=pageContext.findAttribute("age")%><br/>
<%-- 如果没找到,会返回null--%>
<%=pageContext.findAttribute("lala")%><br/>
<%-- 使用EL表达式--%>
<%--带引号相当于字符串--%>
${"username"}<br/>
<%--变量,查不到不返回任何数据--%>
${username}<br/>
${password}<br/>
${address}<br/>
${email}<br/>
${age}<br/>
<%-- 没有找到不会返回任何值--%>
${lala}<br/>
EL表达式操作对象
<h2>使用EL表达式获取对象</h2>
<%
Student student = new Student("小红",12,"北京");
student.setScore(new Score(new BigDecimal(24),new BigDecimal(45)));
pageContext.setAttribute("student", student);
%>
<%-- 不需要强转--%>
${student}<br/>
${student.name}<br/>
${student.address}<br/>
${student.age}<br/>
<%-- 对象里面还有对象,直接调就可以--%>
${student.score}<br/>
${student.score.mathScore}<br/>
${student.score.englishScore}<br/>
EL表达式操作集合
<%--获取List集合--%>
<%
List<String> list = new ArrayList<>();
list.add("苹果");
list.add("香蕉");
list.add("西瓜");
list.add("桃子");
//添加到域
pageContext.setAttribute("list", list);
%>
<%-- 获取list集合中的数据--%>
${list}<br/>
${list[0]}<br/>
${list[1]}<br/>
${list[2]}<br/>
${list[3]}<br/>
<%-- 越界也不会出异常,不做任何操作--%>
${list[5]}<br/>
<%--另一种方式获得集合中的数据--%>
${list}<br/>
<%-- 这种方式不能越界--%>
${list.get(0)}<br/>
${list.get(1)}<br/>
${list.get(2)}<br/>
${list.get(3)}<br/>
EL表达式操作数组
<%--EL表达式操作数组--%>
<%
int[] nums = {1,3,5,2};
pageContext.setAttribute("nums",nums);
%>
${nums[0]}
${nums[1]}
${nums[2]}
${nums[3]}
EL表达式操作Map
<%--EL表达式操作Map--%>
<%
Map<String,String> map = new HashMap<>();
map.put("水果", "西瓜");
map.put("中国", "北京");
map.put("日本", "东京");
map.put("美国", "华盛顿");
map.put("666", "双击");
pageContext.setAttribute("map", map);
%>
${map}<br/>
${map.水果}<br/>
${map.get("中国")}<br/>
${map["日本"]}<br/>
${map['666']}<br/>
EL表达式运算符
+,-,*,/,%
<h2>+ - * / %</h2>
${10+5}<br/>
${10-5}<br/>
${10*5}<br/>
${10/5}<br/>
<%-- 取余--%>
${10%5}<br/>
== != < > <= >=
<%
pageContext.setAttribute("name", new String("张三"));
%>
${100==122}<br/>
${"abc"=="abc"}<br/> true
<%-- 这里eq 和 == 都是比较的值,不是地址--%>
${"张三" eq name}<br/> true
${"张三" == name}<br/> true
${100>122}<br/>
<%-- great than--%>
${100 gt 122}<br/>
${100 < 122}<br/>
${100 lt 122}<br/>
<%-- great than equal--%>
${100 >= 122}<br/>
${100 ge 122}<br/>
${100 <= 122}<br/>
${100 le 122}<br/>
${100 != 122}<br/>
&& ,|| ,!
<h2>&&、||,!</h2>
${true && false}<br/>
${true and false}<br/>
${true || false}<br/>
${true or false}<br/>
${!false}<br/>
?:
<h2>?:</h2>
<%
pageContext.setAttribute("score", 90);
pageContext.setAttribute("flag", 0);
pageContext.setAttribute("gender", "1");
%>
${score >80 ? "优秀":"良好"}<br/> 优秀
${flag == 0 ? "没有激活":"激活成功"}<br/> 没有激活
${gender eq "1" ? "男" : "女"}<br/> 男
判断是否为空
<%
pageContext.setAttribute("color", "black");
pageContext.setAttribute("eye", null);
pageContext.setAttribute("list", new ArrayList<>());
%>
${empty color}<br/> true
${empty eye}<br/> true
${empty list}<br/> true
EL隐式对象(11个)
param
<%
out.print(request.getParameter("username"));
out.print(request.getParameter("password"));
%>
${param.username}<br/>
${param.password}<br/>
paramValues
<%
String[] hobbies = request.getParameterValues("hobby");
for (String hobby : hobbies) {
out.print(hobby);
}
%>
${paramValues.hobby[1]}<br/>
${paramValues.get("hobby")[2]}<br/>
${paramValues["hobby"][2]}<br/>
${paramValues.hobby[0]}<br/>
header
<%
out.print(request.getHeader("Accept"));
%>
${header.accept}<br/>
initParam
<%
out.print(application.getInitParameter("username"));
%>
${initParam.username}
cookie
<%
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
out.print(cookie);
}
%>
${cookie.JSESSIONID.value}<br/>
pageContext
这样就能获得其他八个内置对象,就能调用他们的方法。
<%--获取上下文路径--%>
${pageContext.request.contextPath}<br/>
${pageContext.servletContext.contextPath}<br/>
类似于/myweb
路径分类
//转发 "/" 表示上下文路径,地址是给服务器用的 相当于/myweb/
request.getRequestDispatcher("/aaa/mian.jsp").forward(request, response);
//重定向 "/"表示主机名或域名 地址是给浏览器用的,相当于http://localhost:8080/
response.sendRedirect(request.getContextPath()+"/aaa/mian.jsp");