JSP基础预习
(IDEA新建web项目可参考IDEA创建Web项目详细过程)
(之后右键发现无新建jsp文件可参考此博客及此博客)
以及一些建项目可能遇到的问题
简介
全名 Java Server Pages,其根本是一个简化的Servlet设计,实现了在Java中使用html标签。Jsp是一种动态网页技术标准也是JavaEE的标准。Jsp与Servlet一样,在服务器端执行。
常用动态网站开发技术对比
- Jsp:Java平台,安全性高,适合开发大型的,企业级的Web应用程序。(如hadoop)
- Asp.net: .Net平台,简单易学。但安全性及跨平台性差。
- Php: 简单高效,成本低开发周期短,适合中小企业的Web应用开发。
Jsp页面元素构成
-
指令
- page指令:通常位于jsp页面的顶端,同一个页面可以有多个page指令。
- include指令:将一个外部文件嵌入到当前JSP文件中,同时解析这个页面中的JSP语句。
- taglib指令:使用标签库定义新的自定义标签,在JSP页面中启用定制行为。
page指令
JSP注释
-
html注释: 客户端可见
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <!DOCTYPE html> <html> <head> <title>Hello World</title> </head> <body> <h1><!--Hello World!--> </h1> <br/> <hr> </body> </html>
网页显示:
查看源代码时:
-
JSP的注释:<%–html注释–%> 客户端不可见
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <!DOCTYPE html> <html> <head> <title>Hello World</title> </head> <body> <h1><%--Hello World!--%> </h1> <br/> <hr> </body> </html>
网页显示:
查看源代码时:
-
JSP脚本注释: //单行注释 /* 多行注释 */ 客户端不可见
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <!DOCTYPE html> <html> <head> <title>Hello World</title> </head> <body> <% /*Hello World!*/ %> <% //Hello World! %> <br/> <hr> </body> </html>
网页显示:
查看源代码:
JSP脚本
语法:<% Java代码 %>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>Hello World</title>
</head>
<body>
<%
out.println("大家好");
%>
<hr>
</body>
</html>
网页显示:
JSP的声明
在JSP页面中定义变量或方法。
代码:<%! Java代码%>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>Hello World</title>
</head>
<body>
<%!
String s="张三";
int add(int x,int y) {
return x+y;
}
%>
<hr>
</body>
</html>
JSP表达式
在JSP页面中执行的表达式
语法:<%= 表达式 %> //表达式不以分号结束
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>Hello World</title>
</head>
<body>
<%!
String s="张三";
int add(int x,int y) {
return x+y;
}
%>
<hr>
你好,<%= s %>
x+y=<%= add(5,10) %>
</body>
</html>
JSP页面的生命周期
用户发出请求index.jsp
jspService(方法被调用来处理客户端的请求。对每一个请求,JSP引擎创建一个新的线程来处理该请求。(多线程处理方式)如果多个用户同时请求该JSP文件,则JSP引擎会创建多个线程。每个用户对应一个线程。多线程方式大大降低对系统的资源需求,提高系统并发量及响应时间。但要注意多线程编程带来的同步问题,由于该Servlet始终驻于内存,所以响应时间很快。
当JSP页面发生改变之后,JSP引擎会重新编译,字节码文件更新。
打印九九乘法表
表达式:
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>Hello World</title>
</head>
<body>
<%! String printjiujiu() {
String s="";
for(int i=1;i<=9;i++) {
for(int j=1;j<=i;j++) {
s+=i+"*"+j+"="+(j*i)+" ";
}
s+="<br>";
}
return s;
}
%>
<h1>九九乘法表</h1>
<hr>
<%= printjiujiu()%>
</body>
</html>
脚本(内置out对象):
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>Hello World</title>
</head>
<body>
<%! void printjiujiu(JspWriter out) throws Exception{
for(int i=1;i<=9;i++) {
for(int j=1;j<=i;j++) {
out.println(i+"*"+j+"="+(j*i)+" ");
}
out.println("<br>");
}
}
%>
<h1>九九乘法表</h1>
<hr>
<% printjiujiu(out);%>
</body>
</html>
JSP内置对象
简介
web容器创建的一组对象,不使用new就可以使用的内置对象。(如out对象进行输出)
九大内置对象
-
out
JspWriter类的实例,是向客户端输出内容常用的对象。
常用方法
- void printlin():打印字符串
- void clear():清除缓冲区内容,如果在flush之后会抛异常。
- void clearBuffer():类上,但在flush之后不会抛异常。
- void flush():将缓冲区内容输出到客户端。
- int getBufferSize():返回缓冲区字节数的大小,如不设缓冲区则为零。
- int getRemaining():返回缓冲区可用剩余大小。
- boolean isAutoFlush():返回缓冲区满时,是自动清空还是抛异常。
- void close():关闭输出流。
-
request
客户端的请求被封装到request对象中,通过它才能了解客户的需求,然后做出响应。它是HttpServletRequest类的实例。request对象具有请求域,即完成客户端的请求之前,该对象一直有效。
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <!DOCTYPE html> <html> <head> <title>Hello World</title> </head> <body> <h1>用户注册</h1> <hr> <form action="dologin.jsp" name="loginform" method="post"> <table> <tr> <td>用户名</td> <td><input type="text" name="username"></td> </tr> <tr> <td>密码</td> <td><input type="checkbox" name="favorite" value="read">读书</td> <td><input type="checkbox" name="favorite" value="music">音乐</td> <td><input type="checkbox" name="favorite" value="movie">电影</td> <td><input type="checkbox" name="favorite" value="Internet">上网</td> </tr> <tr> <td colspan="2"><input type="submit" name="登录"></td> </tr> </table> </form> </body> </html>
//dologin内容 <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> 用户名:<%= request.getParameter("username")%> 喜好 :<% String[] f=request.getParameterValues("favorite"); for(int i=0;i<f.length;i++) { out.println(f[i]); } %> </body> </html>
-
response
-
session
- session表示客户端与服务器的一次会话
- web中的session指用户浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间。
- session实际是一个特定的时间概念。
- 在服务器的内存中保存着不同用户的session。
session对象
- session对象是一个JSP内置对象。
- session对象在第一个JSP页面被装载时自动创建,完成会话期管理。
- 从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,称为一个对话。
- 当一个客户访问一个服务器时,可能会在服务器的几个页面之间切换,服务器应当通过某个方法知道这是一个客户,就需要session对象。
- session对象时HttpSession类的实例。
常用方法
生命周期
-
创建
当客户端第一次访问某个JSP或Servlet时,服务器会为该会话创建一个SessionId,每次客户端向服务端发送请求时,会将SessionId携带过去,服务器对其检验。
-
活动
某次对话中通过超链接打开的新页面属于同一次会话
只要当前会话页面没有全部关闭,重新打开新的浏览器窗口访问同一项目资源时属于同一次会话
除非本次会话的所有页面都关闭后再重新访问某个JSP或Servlet将会创建新的对话。(原有会话还存在,旧SessionId存在于服务端。不过没有客户端携带他然后让服务端检验)
-
销毁
- 调用session.invalidate()方法。
- Session过期(超时)。
- 服务器重启。
-
application
application对象实现了用户间数据的共享,可存放全局变量。
开始于服务器的启动,终止于服务器的关闭。
在用户的前后连接或不同的用户之间的连接中,可以对application对象的同一属性进行操作。
服务器的启动和关闭决定了application对象的生命。
是ServletContext类的实例。
-
page
-
pageContext
- pageContext对象提供了对JSP页面内所有的对象及名字空间的访问
- pageContext对象可以访问到本页所在的session,也可以取本页面所在的application的某一属性值。
- pageContext对象相当于页面中所有功能的集大成者。
- pageContext对象的本类名也叫pageContext。
-
exception
exception对象是一个异常对象,当一个页面在运行过程中发生了异常,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。他实际上是java.lang.Throwable的对象,常用方法如下:
-
config
web程序的请求响应模式
用户发出请求(request)
服务器给用户响应(response)
例如:
缓冲区
- Buffer缓冲区域用来保存临时数据。
IO输出最原始的是一个字节一个字节输出,效率太差。
缓冲区可以实现一起输出。
get和post区别
form name=“regForm” action=“动作” method=“提交方式”>
- get:以明文方式通过URL提交数据,数据在URL中可见。提交的数据最多不超过2kb.安全性较低但效率比post高。适合提交数据量不大,安全性不高的数据。如:搜索,查询
- post:将用户提交的信息封装到HTML HEADER内。适合提交数据量大,安全性高的用户信息。如:注册,修改,上传
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <!DOCTYPE html> <html> <head> <title>Hello World</title> </head> <body> <h1>用户登录</h1> <hr> <form action="dologin.jsp" name="loginform" method="get"> <table> <tr> <td>用户名</td> <td><input type="text" name="username"></td> </tr> <tr> <td>密码</td> <td><input type="password" name="password"></td> </tr> <tr> <td colspan="2"><input type="submit" name="登录"></td> </tr> </table> </form> </body> </html>
post不会显示
请求转发与请求重定向
请求重定向:客户端行为,response.sendRedirect(),本质上等同于两次请求,前一次请求对象不会保存,地址栏的URL地址会改变。
请求转发:服务器行为,request.getRequestDispatcher().forward(req,resp;是一次请求,转发后请求对象会保存,地址栏URL地址不会改。
Javabean
-
简介
Javabeans就是符合某种特定的规范的java类。使用javabeans的好处是解决代码重复编写,减少代码冗余,功能区分明确,提高代码维护性。
-
JSP动作
-
JSP中如何使用javabeans
-
像使用普通java类一样,创建javabean实例。
public class users { private String username; private String password; public users() { } public String getname() { return username; } public String getpassword() { return password; } public void setname(String username) { this.username=username. } public void setpassword(String password) { this.password=password; } } /* 然后在jsp导入:<%@ page import="路径" %> <% users user =new users(); user.setname("..."); user.setpassword("..."); %> 之后在body中使用get方法即可获取 */
-
在JSP页面中通常使用jsp动作标签使用javabean。
-
useBeans
java类名应为全名,即包括包名。
<jsp:useBean id="myusers" class="com.po.users" scope="page"/> 用户名:<%= myusers.getname(); 密码: <%= myusers.getpassword(); /*返回: 用户名:null 密码: null */
-
setProperty
-
当property="*"时(根据表单匹配所有属性):
<form name="loginForm" action="dologin.jsp" method="post"> <table> <tr> <td>用户名:</td> <td><input type="text" name="username" value=""/></td> </tr> <tr> <td>密码:</td> <td><input type="password" name="password" value=""/></td> </tr> <tr> <td colspan="2" align="center"><input type="submit" value="登录"/></td> </tr>
//dologin.jsp: <jsp:useBean id="myusers" class="com.po.users" scope="page"/> // 自动匹配 <jsp:setProperty name="myusers" propert="*"/> 用户名:<%=myusers.getname() %> 密码:<%=myusers.getpassword() %>
-
当property="JavaBean属性名时"时(根据表单匹配部分属性):
<jsp:setProperty name="myusers" propert="username"/> //密码无值
-
使用value跟表单无关,手工赋值。
<jsp:setProperty name="myusers" propert="username" value="lisi"/> <jsp:setProperty name="myusers" propert="password" value="123456"/> //设置用户名,密码。表单值无效。
-
通过URL传参,给属性赋值
<!--form处需改变--> <form name="loginForm" action="dologin.jsp?mypass=123456" method="post"> <jsp:setProperty name="myusers" propert="password" param="mypass"/> <!--password为123456,同时用户名为null-->
-
-
getProperty
-
-
-
JSP四个作用域范围
<!-- scope为request时,表单提交后使用<a href="test.jsp"></a>--> <!-- 不能获得用户名和密码(这是重定向),但使用以下代码--> <% request.getRequestDispatcher("test.jsp").forward(request,response); %> <!-- 可以获得(这是内部转发,属于同一次请求),而page只在当前页面有效-->
-
Model 1简介
-
Model 1模型出现前,整个Web应用的情况:几乎全部由JSP页面组成,JSP页面接受处理客户端请求,对请求处理后直接做出响应。
弊端:在界面层充斥着大量的业务逻辑代码和数据访问层的代码,Web程序的可扩展层和可维护性非常差。
javabean的出现可以使jsp页面中使用javabean封装的数据或调用javabean的业务逻辑代码,大大提高了程序的可维护性。
-
JSP状态管理
http协议的无状态性
无状态指当浏览器发送请求给服务器时,服务器响应客户端请求。但当同一个浏览器再次发送请求给服务器时,服务器不知道他是刚才的浏览器。
简单来说,就是服务器不会记住你。
保存用户状态的两大机制
-
session
-
cookie
是web服务器保存在客户端的一系列文本信息。
- 例一:判断注册用户是否已登陆网站,保存登录信息。
- 例二:”购物车“的处理。
作用:
- 对特定对象追踪
- 保存用户网页浏览记录和习惯
- 简化登录
安全风险:易泄漏用户信息
JSP中创建和使用cookie
-
常用方法
-
code实现
<% //首先判断用户是否选择记住登陆状态 String[] isUseCookie=request.getParameterValues("isUseCookie")//引号中是用户界面是否保存的按钮的名字 if(isUseCookie!=null&&isUseCookie.length>0) { //把用户名和密码保存在cookie里 String username=request.getParameter("username"); String password=request.getParameter("password"); Cookie usernameCookie=new Cookie("username",username);//键值对 Cookie passwordCookie=new Cookie("password",password); usernameCookie.setMaxAge(864000); passwordCookie.setMaxAge(864000);//最大生存期限 response.addCookie(usernameCookie); response.addCookie(passwordCookie); } else { Cookie[] cookies=request.getCookies(); if(cookies!=null&&cookies.length>0) { for(Cookie c:cookies) { if(c.getName().equals("username")||c.getName().equals("password")) { c.setMaxAge(0);//设置Cookie失效 response.addCookie(c);//重新保存 } } } } %>
获取:
<% String username=""; String password=""; Cookie[] cookies=request.getCookies(); if(cookies!=null&&cookies.length>0) { for(Cookie c:cookies) { if(c.getName().equals("username")) { username=c.getValue(); } if(c.getName().equals("password")) { password=c.getValue(); } } } %> //username和password获取到了
中文转码:
引入java的java.net.*
使用 request.setCharacterEncoding(“utf-8”);
URLEncoder.encode(… , “utf-8”);
URLDecoder.decode(… , “utf-8”);
-
session和cookie对比
指令和动作
include
-
指令语法:<%@ include file=“URL”%>
-
动作语法:<jsp:include page=“URL” flush=“true|false”/> page为要访问的页面,flush为被包含页面是否从缓冲区读取。
-
区别:
forward动作
-
语法:<jsp:forward page=“URL”/>
等同于request.getRequestDispatcher("/url").forward(request,response);
param动作
-
语法:<jsp:param name=“参数名” value=“参数值”>
常常与jsp:forward一起使用,作为其子标签。
<jsp:forward page="user.jsp"> <jsp:param value="admin@123.net" name="email"/> </jsp:forward> //添加电子邮箱的值,也可在此更改表单提交的值
本文参考了慕课:JAVA遇见HTML-JSP篇