java-jsp-learnning
Posted 小丑quan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java-jsp-learnning相关的知识,希望对你有一定的参考价值。
简介:JSP(全称Java Server Pages)
一种动态网页开发技术。它使用JSP标签在html网页中插入Java代码。标签通常以<%开头以%>结束。
JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。
JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
jsp的结构
需要一个JSP引擎,也就是一个容器来处理JSP页面。容器负责截获对JSP页面的请求
jsp处理过程:
1就像其他普通的网页一样,您的浏览器发送一个HTTP请求给服务器。
2Web服务器识别出这是一个对JSP网页的请求,并且将该请求传递给JSP引擎。通过使用URL或者.jsp文件来完成。
3JSP引擎从磁盘中载入JSP文件,然后将它们转化为servlet。这种转化只是简单地将所有模板文本改用println()语句,
并且将所有的JSP元素转化成Java代码。
4SP引擎将servlet编译成可执行类,并且将原始请求传递给servlet引擎。
5Web服务器的某组件将会调用servlet引擎,然后载入并执行servlet类。在执行过程中,servlet产生HTML格式的输出
并将其内嵌于HTTP response中上交给Web服务器。
6Web服务器以静态HTML网页的形式将HTTP response返回到您的浏览器中。
一般情况下,JSP引擎会检查JSP文件对应的servlet是否已经存在,并且检查JSP文件的修改日期是否早于servlet。如果JSP文件的修改日期早于对应的servlet,那么容器就可以确定JSP文件没有被修改过并且servlet有效。这使得整个流程与其他脚本语言(比如php)相比要高效快捷一些。
jsp语法:
jsp格式:脚本程序
脚本程序可以包含任意量的Java语句、变量、方法或表达式,只要它们在脚本语言中是有效的
<% 代码片段 %>
eg:
<head>
<title>你好</title>
</head>
<body>
hhhhhhhhhhh
<% out.println("howtosay"+ request.getRemoteAddr());
%>
</body>
</html>
re:
jsp格式:声明
声明一个或多个变量、方法,供后面的Java代码使用。在JSP文件中,您必须先声明这些变量和方法然后才能使用它们。
<%! declaration; [ declaration; ]+ ... %>
eg:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Jsp的声明</title>
</head>
<body>
<%! int i = 0; %>
<% out.print(i); %>
</body>
</html>
jsp格式:表达式
一个JSP表达式中包含的脚本语言表达式,先被转化成String,然后插入到表达式出现的地方。
<%= 表达式 %>
表达式元素中可以包含任何符合Java语言规范的表达式,但是不能使用分号来结束表达式。
eg:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Jsp的表达式</title> </head> <body> <p> <%-- 没有等号会报错500--%> time: <%=(new java.util.Date()).toLocaleString()%> </p> </body> </html>
jsp格式-注释
<%-- 这里可以填写 JSP 注释 --%>
jsp格式:指令
用来设置与整个JSP页面相关的属性。
<%@ directive attribute="value" %>
包括:
指令 | 描述 |
---|---|
<%@ page ... %> | 定义页面的依赖属性,比如脚本语言、error页面、缓存需求等等 |
<%@ include ... %> | 包含其他文件 |
<%@ taglib ... %> | 引入标签库的定义,可以是自定义标签 |
page指令:为容器提供当前页面的使用说明,一个jsp页面可以包含多个page指令
inclued指令可以包含一下文件,jsp html等文件,会一起编译
target指令,自定义一些标签
jsp格式-行为
JSP行为标签使用XML语法结构来控制servlet引擎。它能够动态插入一个文件,重用JavaBean组件,引导用户去另一个页面,为Java插件产生相关的HTML等等。
<jsp:action_name attribute="value" />
所有动作都哟两个属性:
id属性:动作元素的唯一标识,
scope属性:
该属性用于识别动作元素的生命周期
scope属性有四个可能的值: (a) page, (b)request, (c)session, 和 (d) application。
<jsp:inclued>动作元素:
包含静态和动态的文件。该动作把指定文件插入正在生成的页面
<jsp:include page="relative URL" flush="true" />
里的jsp:include动作不同,插入文件的时间是在页面被请求的时候。
属性列表:
<jsp:useBean>动作
装载一个将在JSP页面中使用的JavaBean。
<jsp:useBean id="name" class="package.class" />
属性:
<jsp:setProperty>动作元素
设置已经实例化的Bean对象的属性
再工作useBean后面使用,不管找到一个现有的Bean,还是新建一个Bean实例,setProperty都会执行
再。。。。里面的话,只有咋新建实例时才会执行,如果使用现有实例则不执行。
<jsp:setProperty name="myName" property="someProperty" .../>
name: 表示要设置属性的是哪个Bean,必须
property:表示要设置的属性,必须。如果property的值是"*",表示所有名字和Bean属性名字匹配的请求参数都将被传递给相应的属性set方法。
<jsp:getProperty>动作元素
提取指定Bean属性的值,转换成字符串,然后输出
<jsp:useBean id="myName" ... /> ... <jsp:getProperty name="myName" property="someProperty" .../>
结合实例:
javabean:
package quan; public class TestBean { private String message = "no message specifid"; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
javabean.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Using java Bean</title> </head> <body> <jsp:useBean id="quan" class="quan.TestBean"/> <jsp:setProperty name="quan" property="message" value="quanzhiqinag"/> <h3>获取quan类中的message属性</h3> <jsp:getProperty name="quan" property="message"/> </body> </html>
<jsp:forward> 动作元素
把请求转到另外的页面。jsp:forward标记只有一个属性page。
<jsp:forward page="Relative URL" />
page:page属性包含的是一个相对URL,可以是一个JSP页面或者一个 Java Servlet.
实现转发的jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>jsp:forward</title> </head> <body> <h1>forward example</h1> <jsp:forward page="date.jsp"/> </body> </html>
转发到的jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <body> time: <%=(new java.util.Date()).toLocaleString()%> </body> </html>
re:
<jsp:plugin>动作元素
<jsp:element> 、 <jsp:attribute>、 <jsp:body>动作元素,动态定义XML元素
<jsp:text>动作
允许在JSP页面和文档中使用写入文本的模板
<jsp:text>Template data</jsp:text>
文本模板不能包含其他元素,只能只能包含文本和EL表达式
jsp中的对象:
request对象
是javax.servlet.http.HttpServletRequest 类的实例
每当客户端请求一个JSP页面时,JSP引擎就会制造一个新的request对象来代表这个请求。
response对象
是javax.servlet.http.HttpServletResponse类的实例
服务器创建request对象时会同时创建用于响应这个客户端的response对象。
out对象
out对象是 javax.servlet.jsp.JspWriter 类的实例,用来在response对象中写入内容。
JspWriter类包含了大部分java.io.PrintWriter类中的方法
session对象
session对象是 javax.servlet.http.HttpSession 类的实例。
application对象
直接包装了servlet的ServletContext类的对象,是javax.servlet.ServletContext 类的实例
这个对象在JSP页面的整个生命周期中都代表着这个JSP页面。这个对象在JSP页面初始化时被创建,
随着jspDestroy()方法的调用而被移除。通过向application中添加属性,则所有组成您web应用
的JSP文件都能访问到这些属性。
相当于,servlet的Context
config对象
config对象是 javax.servlet.ServletConfig 类的实例,直接包装了servlet的ServletConfig类的对象
允许开发者访问Servlet或者JSP引擎的初始化参数,比如文件路径等。
pageContext对象
是javax.servlet.jsp.PageContext 类的实例,用来代表整个JSP页面。
page对象
这个对象就是页面实例的引用。它可以被看做是整个JSP页面的代表。
page 对象就是this对象的同义词。
jsp-if elas
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%! int day = 2;%> <html> <head> <title>ifelse</title> </head> <body> <% if (day ==1 |day ==7) {%> <p>Today is weekend</p> <%}else {%> <p>Togy is not weekend</p> <%} %> <%switch (day){ case 0: out.println("00000"); break; case 1: out.println("1111"); break; case 2: out.println("33333"); break; default: out.println("default"); }%> </body> </html>
js[请求
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>http头部信息</title> </head> <body> <h2>http头部信息</h2> <table width="100%" border="1" align="center"> <tr bgcolor="blue"> <th>HeaderName</th> <th>Values</th> </tr> <% Enumeration hname = request.getHeaderNames(); while (hname.hasMoreElements()){ String name = (String)hname.nextElement(); out.print("<tr><td>"+name+"</td>\\n"); String value = request.getHeader(name); out.print("<td>"+value+"</td></tr>\\n"); } %> </table> </body> </html>
re
jsp响应
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>自动时钟-respon</title> </head> <body> <h3>quan\'s clock</h3> <% response.setIntHeader("Refresh",1); String amorpm; Calendar calendar = new GregorianCalendar(); if(calendar.get(Calendar.AM_PM) ==0){ amorpm = "AM"; }else { amorpm = "PM"; } int h = calendar.get(Calendar.HOUR); int y = calendar.get(Calendar.YEAR); int m = calendar.get(Calendar.MINUTE); int s = calendar.get(Calendar.SECOND); String T = "current\'s Time " + y + " " + h +":"+m+":"+s +amorpm; out.print(T); %> </body> </html>
re
设置http状态码方法
HttpServletResponse 类中用来设置状态码的方法:
<% // 设置错误代码,并说明原因 response.sendError(407, "Need authentication!!!" ); %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>重定向</title> </head> <body> <% String url = "https://www.runoob.com/java/java-string-indexof.html"; response.setStatus(response.SC_MOVED_TEMPORARILY);//设置响应码 response.setHeader("Location",url); %> </body> </html>
jsp处理表单
经常需要向服务器提交信息,并让后台程序处理。浏览器中使用 GET 和 POST 方法向服务器提交数据。
get:
GET方法将请求的编码信息添加在网址后面,网址与编码信息通过"?"号分隔。 GET方法是浏览器默认传递参数的方法,一些敏感信息,如密码等建议不使用GET方法。 用get时,传输数据的大小有限制 (注意不是参数的个数有限制),最大为1024字节。
post;
一些敏感信息,如密码等我们可以同过POST方法传递,post提交数据是隐式的。
POST提交数据是不可见的,GET是通过在url里面传递的(可以看一下你浏览器的地址栏)。
JSP使用getParameter()来获得传递的参数,getInputStream()方法用来处理客户端的二进制数据流的请求。
jsp读取表单
getParameter(): 使用 request.getParameter() 方法来获取表单参数的值。
getParameterValues(): 获得如checkbox类(名字相同,但值有多个)的数据。 接收数组变量 ,如checkobx类型
getParameterNames():该方法可以取得所有变量的名称,该方法返回一个Emumeration。
getInputStream():调用此方法来读取来自客户端的二进制数据流。
URL-GET
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> name <%=request.getParameter("name")%> age <%= request.getParameter("age")%> </body> </html>
http://localhost:8088/JSP/form/geturl.jsp?name=quan&age=35
FROM-GET
最初访问的html文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>form-get</title> </head> <body> <form action="JSP/form/geturl.jsp" method="get"> <br/> Name <input type="text" name="name"/> Age <input type="text" name="age"\\> <input type="submit" value="Submit"> </form> </body> </html>
geturl.jsp就是上面的文件
显示在URL中
FROM-POST
将上面表单的method改为post
<form action="JSP/form/geturl.jsp" method="post"> <br/> Name <input type="text" name="name"/> Age <input type="text" name="age"\\> <input type="submit" value="Submit"> </form>
结果:
checkbox数据传递到jsp程序
jsp-上传文件
JSP可以通过HTML的form表单上传文件到服务器。 文件类型可以是文本文件、二进制文件、图像文件等其他任何文档。
form表单 method 属性必须设置为 POST 方法 ,不能使用 GET 方法。 form表单 enctype 属性需要设置为 multipart/form-data。 form表单 action 属性需要设置为提交到后台处理文件上传的jsp文件地址。例如 uploadFile.jsp 程序文件用
来处理上传的文件。 上传文件元素需要使用 <input .../> 标签,属性设置为 type="file"。如果需要上传多个文件,可以
在 <input .../>标签中设置不同的名称。
预先再web.xml设置上传文件的路径
<web-app> <context-param> <param-name>file_upload_path</param-name> <param-value>C:\\Users\\better.quan\\Desktop\\init</param-value> </context-param> <display-name>Archetype Created Web Application</display-name> </web-app>
html表单:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>FIle upload</title> </head> <body> <form action="../jsp/fileupload.jsp" method="post" enctype="multipart/form-data"> <input type="file" name="file" size="50"/> <br/> <br/> <input type="submit" value="上传"/> </form> </body> </html>
后端处理表单:
<%@ page import="java.io.*,java.util.*, javax.servlet.*" %> <%@ page import="javax.servlet.http.*" %> <%@ page import="org.apache.commons.fileupload.*" %> <%@ page import="org.apache.commons.fileupload.disk.*" %> <%@ page import="org.apache.commons.fileupload.servlet.*" %> <%@ page import="org.apache.commons.io.output.*" %> <% File file ; int maxFileSize = 5000 * 1024; int maxMemSize = 5000 * 1024; ServletContext context = pageContext.getServletContext(); String filePath = context.getInitParameter("file_upload_path"); // 验证上传内容了类型 String contentType = request.getContentType(); if ((contentType.indexOf("multipart/form-data") >= 0)) { DiskFileItemFactory factory = new DiskFileItemFactory(); // 设置内存中存储文件的最大值 factory.setSizeThreshold(maxMemSize); // 本地存储的数据大于 maxMemSize. factory.setRepository(new File("d:\\\\temp")); // 创建一个新的文件上传处理程序 ServletFileUpload upload = new ServletFileUpload(factory); // 设置最大上传的文件大小 upload.setSizeMax( maxFileSize ); try{ // 解析获取的文件 List fileItems = upload.parseRequest(request); // 处理上传的文件 Iterator i = fileItems.iterator(); out.println("<html>"); out.println("<head>"); out.println("<title>JSP File upload</title>"); out.println("</head>"); out.println("<body>"); while ( i.hasNext () ) { FileItem fi = (FileItem)i.next(); if ( !fi.isFormField () ) { // 获取上传文件的参数 String fieldName = fi.getFieldName(); String fileName = fi.getName(); boolean isInMemory = fi.isInMemory(); long sizeInBytes = fi.getSize(); // 写入文件 if( fileName.lastIndexOf("\\\\") >= 0 ){ file = new File( filePath , fileName.substring( fileName.lastIndexOf("\\\\"))) ; }else{ file = new File( filePath , fileName.substring(fileName.lastIndexOf("\\\\")+1)) ; } fi.write( file ) ; out.println("Uploaded Filename: " + filePath + fileName + "<br>"); } } out.println("</body>"); out.println("</html>"); }catch(Exception ex) { System.out.println(ex); } }else{ out.println("<html>"); out.println("<head>"); out.println("<title>Servlet upload</title>"); out.println("</head>"); out.println("<body>"); out.println("<p>No file uploaded</p>"); out.println("</body>"); out.println("</html>"); } %>
re:
由于目录有中文,乱码了
filter过滤器
Servlet和JSP中的过滤器都是Java类,它们存在的目的如下:
- 在请求访问后端资源时拦截它
- 管理从服务器返回给客户端的响应
实现了javax.servlet.Filter 接口。javax.servlet.Filter接口定义了三个方法
和servlet的差不多
编写一个filter
import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; import java.util.Date; @WebFilter(filterName = "FilterJsp") public class FilterJsp implements Filter { public void destroy() { } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { String addr = req.getRemoteAddr(); System.out.println("ipaddr: " + addr + "time: " + new Date().toString()); chain.doFilter(req, resp); } public void init(FilterConfig config) throws ServletException { } }
修改web.xml
<filter> <filter-name>filterjsp</filter-name> <filter-class>FilterJsp</filter-class> </filter> <filter-mapping> <filter-name>filterjsp</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
进行访问之后
可以使用多重过滤器,他的顺序如下;
在web.xml中<filter>元素的映射顺序决定了容器应用这些过滤器的顺序。要反转应用的顺序,您只需要反转web.xml
中<filter>元素的定义顺序就行了。
jspCookie
Cookies是存储在客户机的文本文件,它们保存了大量轨迹信息。在servlet技术基础上,JSP显然能够提供对HTTP cookies的支持。
服务器脚本发送一系列cookies至浏览器。比如名字,年龄,ID号码等等。
浏览器在本地机中存储这些信息,以备不时之需。
当下一次浏览器发送任何请求至服务器时,它会同时将这些cookies信息发送给服务器,然后服务器使用这些
信息来识别用户或者干些其它事情。
Servlet Cookie方法
header
获取cookie:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>get cookie</title> </head> <body> <% Cookie[] cookies = request.getCookies(); System.out.println(cookies.length); if(!cookies.equals(null)){ for (Cookie cookie : cookies) { String cname = cookie.getName(); String cvalue = cookie.getValue(); System.out.println(cname + "------" + cvalue+"\\n"); } } %> </body> </html>
删除cookie和servlet的一样:
cookie.setMaxAge(0);
response.addCookie(cookie)
session
<%@ page import="java.util.Date" %><%-- Created by IntelliJ IDEA. User: better.quan Date: 2020/6/30 Time: 14:46 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <% // 获取session创建时间 Date createTime = new Date(session.getCreationTime()); // 获取最后访问页面的时间 Date lastAccessTime = new Date(session.getLastAccessedTime()); String title = "Welcome Back to my website"; int visitCount = 0; String visitCountKey = new String("visitCount"); String userIDKey = new String("userID"); String userID = new String("ABCD"); // 检测网页是否由新的访问用户 if (session.isNew()){ title = "Welcome to my website"; session.setAttribute(userIDKey, userID); session.setAttribute(visitCountKey, visitCount); } visitCount = (int)session.getAttribute(visitCountKey); visitCount = visitCount + 1; userID = (String)session.getAttribute(userIDKey); session.setAttribute(visitCountKey, visitCount); %> <html> <head> <title>Session Tracking</title> </head> <body> <center> <h1>Session Tracking</h1> </center> <table border="1" align="center"> <tr bgcolor="#949494"> <th>Session info</th> <th>Value</th> </tr> <tr> <td>id</td> <td><% out.print( session.getId()); %></td> </tr> <tr> <td>Creation Time</td> <td><% out.print(createTime); %></td> </tr> <tr> <td>Time of Last Access</td> <td><% out.print(lastAccessTime); %></td> </tr> <tr> <td>User ID</td> <td><% out.print(userID); %></td> </tr> <tr> <td>Number of visits</td> <td><% out.print(visitCount); %></td> </tr> </table> </body> </html>
re:
jsp-date
Date类:
它在java.util包下,封装了当前日期和时间。
第一个构造函数,以当前时间初始化对Date();
第二个构造函数接受一个参数(表示从1970年1月1日凌晨至所要表示时间的毫秒数)
Date(long millisec)
获取当前时间和日期:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>get date</title> </head> <body> <% Date d = new Date(); SimpleDateFormat f = new SimpleDateFormat("E yyyy.MM.dd \'at\' hh:mm:ss a zzz"); String df = f.format(d); out.println(df+"\\n"); out.print(LocalDate.now()); %> </body> </html>
re:
JSP页面重定向:
可以使用response.sendRedirect()方法
String site = "http://www.manongjc.com" ; response.setStatus(response.SC_MOVED_TEMPORARILY); response.setHeader("Location", site);
或者使用setStatus 和setHander方法结合得到同样的效果:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>重定向</title> </head> <body> <% String url = "https://www.runoob.com/java/java-string-indexof.html"; response.setStatus(response.SC_MOVED_TEMPORARILY);//设置响应码 response.setHeader("Location",url); %> </body> </html>
访问http://localhost:8080/JSP/redirect.jsp
最终会跳转到
jsp计数:
需要知道某个页面被访问的次数,这时我们就需要在页面上添加页面统计器,页面访问的统计一般在用户第一次载入时累加该页面的访问数上。
可以利用应用程序隐式对象和相关方法getAttribute()和setAttribute()来实现。
application.setAttribute(String Key, Object Value);
application.getAttribute(String Key);
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>计数器</title> </head> <body> <% Integer numvalue = (Integer)application.getAttribute("num"); if( numvalue ==null || numvalue == 0 ){ numvalue = 1; }else{ numvalue += 1; } application.setAttribute("num", numvalue); %> <h3>访问的次数为:<%=numvalue%></h3> </body> </html>
re
复位计数器
在web服务器重启后,计数器会被复位为0,即前面保留的数据都会消失
在数据库中定义一个用于统计网页访问量的数据表count,字段为hitcount,hitcount默认值为0,
将统计数据写入到数据表中。
在每次访问时我们读取表中hitcount字段。
每次访问时让hitcount自增1。
在页面上显示新的 hitcount 值作为页面的访问量。
如果你需要统计每个页面的访问量,你可以使用以上逻辑将代码添加到所有页面上。
jsp自动刷新:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>get date</title> </head> <body> <% response.setIntHeader("Refresh",1); Date d = new Date(); SimpleDateFormat f = new SimpleDateFormat("E yyyy.MM.dd \'at\' hh:mm:ss a zzz"); String df = f.format(d); out.println(df+"\\n"); out.print(LocalDate.now()); %> </body> </html>
备注SimpleDateFormat格式码:
字符 | 描述 | 示例 |
---|---|---|
G | 时代标识符 | AD |
y | 4位数年份 | 2001 |
M | 月 | July or 07 |
d | 日 | 10 |
h | 12小时制, A.M./P.M. (1~12) | 12 |
H | 24小时制 | 22 |
m | 分钟 | 30 |
s | 秒 | 55 |
S | 毫秒 | 234 |
E | 星期 | Tuesday |
D | 一年中的某天 | 360 |
F | 一个月中某星期的某天 | 2 (second Wed. in July) |
w | 一年中的某星期 | 40 |
W | 一个月中的某星期 | 1 |
a | A.M./P.M. 标记 | PM |
k | 一天中的某个小时 (1~24) | 24 |
K | 一天中的某个小时,A.M./P.M. (0~11) | 10 |
z | 时区 | Eastern Standard Time |
\' | 文本分隔 | Delimiter |
" | 单引号 | ` |
记录大坑:
加载的javaBean类必须再某个文件夹下面,不允许放在根目录下
以上是关于java-jsp-learnning的主要内容,如果未能解决你的问题,请参考以下文章