JSP学习与总结

1.JSP页面中<%!%>与<%%>与<%=%>

       首先,我们要了解jsp运行原理。JSP的本质就是一个Servlet,JSP的运行之前会先被Tomcat服务器翻译为.java文件,然后在将.java文本编译为.class文件,而我们在访问jsp时,处理请求的就是那个翻译后的类。
  1.<% %>叫做脚本片段,java代码,其中写的内容会翻译在Servlet的Service方法中,显然我们可以在Service方法中定义局部变量或者调用其他方法,但是不能在Service中再定义其他的方法,也就是我们可以在<%%>中定义局部变量或者调用方法,但不能定义方法。在jsp页面可以有多个脚本片段,但是多个脚本片段之间要保证结构完整。
  2.<%!%>称作声明,其中写的内容将来会直接翻译在Servlet类中,因为我们可以在类中定义方法和属性以及全局变量,所以我们可以在<%!%>中声明方法、属性、全局变量。
  3.<%=%>称作jsp表达式,用于将已经声明的变量或者表达式输出到网页上面。
  4.直接写在jsp页面<body></body>中的代码称作模板元素,将来会Servlet的Service方法中的out.write("_")中,作为输出内容。

将jsp页面放入tomcat的ROOT文件夹下访问:D:\workTool\Tomcat 9.0\webapps\ROOT

举例一:

<body>
    <% for (int i=0; i<3; i++) { %>
        out.print(i*2);
    <% } %>
</body>

结果:

举例二:

<body>
    <%! int sum=1; %>
    <% int sum=8; %>
    <h3>***<% out.print(sum++); %></h3>
    <h3>***<%= this.sum %></h3>
</body>

结果:

————————————————————————————————

Tomcat启动窗口里面乱码,解决如下:

打开cd到tomcat/conf/目录下修改logging.properties

找到

java.util.logging.ConsoleHandler.encoding = utf-8

更改为

java.util.logging.ConsoleHandler.encoding = GBK


————————————————————————————————

2.jsp include 动作实例

date.jsp:

<%@page language="java" contentType="text/html;charset=UTF-8"%>
<%@page pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Date Page</title>
    </head>
    <body>
    	<p>
    		今天的日期:<%= (new java.util.Date()).toLocaleString()%>
    	</p>
 	</body>
</html>

main.jsp:

<%@page language="java" contentType="text/html;charset=UTF-8"%>
<%@page pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Main Page</title>
    </head>
    <body>
    	<h2>include 动作实例</h2>
    	<jsp:include page="date.jsp" flush="true" />
 	</body>
</html>

3.jsp forward动作实例

main.jsp:

<%@page language="java" contentType="text/html;charset=UTF-8"%>
<%@page pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Main Page</title>
    </head>
    <body>
    	<h2>forward动作实例</h2>
    	<jsp:forward page="date.jsp" />
 	</body>
</html>

JSP所支持的九大隐式对象:

对象描述
requestHttpServletRequest 接口的实例
responseHttpServletResponse 接口的实例
outJspWriter类的实例,用于把结果输出至网页上
sessionHttpSession类的实例
applicationServletContext类的实例,与应用上下文有关
configServletConfig类的实例
pageContextPageContext类的实例,提供对JSP页面所有对象以及命名空间的访问
page类似于Java类中的this关键字
ExceptionException类的对象,代表发生错误的JSP页面中对应的异常对象

HTTP信息头示例

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>heads Page</title>
    </head>
    <body>
    	<h2>HTTP 头部请求实例</h2>
		<table width="100%" border="1" align="center">
			<tr bgcolor="#949494">
				<th>Header Name</th>
				<th>Header Value(s)</th>
			</tr>
			<%
			   Enumeration headerNames = request.getHeaderNames();
			   while(headerNames.hasMoreElements()) {
			      String paramName = (String)headerNames.nextElement();
			      out.print("<tr><td>" + paramName + "</td>\n");
			      String paramValue = request.getHeader(paramName);
			      out.println("<td> " + paramValue + "</td></tr>\n");
			   }
			%>
		</table>
 	</body>
</html>

结果:

HTTP响应头程序示例

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>resposne page</title>
</head>
<body>
	<h2>自动刷新实例</h2>
	<%
	   // 设置每隔5秒自动刷新
	   response.setIntHeader("Refresh", 5);
	   // 获取当前时间
	   Calendar calendar = new GregorianCalendar();
	   String am_pm;
	   int hour = calendar.get(Calendar.HOUR);
	   int minute = calendar.get(Calendar.MINUTE);
	   int second = calendar.get(Calendar.SECOND);
	   if(calendar.get(Calendar.AM_PM) == 0)
	      am_pm = "AM";
	   else
	      am_pm = "PM";
	   String CT = hour+":"+ minute +":"+ second +" "+ am_pm;
	   out.println("当前时间: " + CT + "\n");
	%>
</body>
</html>

结果:

HTTP状态码程序示例

<%@page language="java" contentType="text/html;charset=UTF-8"%>
<%@page pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>Setting HTTP Status Code</title>
</head>
<body>
<%
   // 设置错误代码,并说明原因
   response.sendError(403, "Need authentication!!!" );
%>
</body>
</html>

结果:

JSP 表单处理

JSP 读取表单数据

  • getParameter(): 使用 request.getParameter() 方法来获取表单参数的值。

  • getParameterValues(): 获得如checkbox类(名字相同,但值有多个)的数据。 接收数组变量 ,如checkbox类型

  • getParameterNames():该方法可以取得所有变量的名称,该方法返回一个 Enumeration。

  • getInputStream():调用此方法来读取来自客户端的二进制数据流。

使用表单的 GET方法实例

get.jsp:

<%@page language="java" contentType="text/html;charset=UTF-8"%>
<%@page pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>GET Page</title>
    </head>
    <body>
    	<h1>使用 GET 方法读取数据</h1>
		<ul>
		<li>
			<p><b>站点名:</b>
		   		<%= request.getParameter("name")%>
			</p>
		</li>
		<li>
			<p><b>网址:</b>
		   		<%= request.getParameter("url")%>
			</p>
		</li>
		</ul>
 	</body>
</html>

结果:http://localhost:8080/get.jsp?name=%E5%B0%8F%E7%9F%B3%E6%BD%AD%E8%AE%B0&url=http://ww.runoob.com

GET表单提交:getForm.jsp将数据提交到上面的get.jsp页面中。

getForm.jsp:

<%@page language="java" contentType="text/html;charset=UTF-8"%>
<%@page pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>GET Page</title>
    </head>
    <body>
    	<h1>使用 GET 方法提交数据</h1>
		<form action="get.jsp" method="GET">
			站点名: <input type="text" name="name">
			<br />
			网址: <input type="text" name="url" />
			<input type="submit" value="提交" />
		</form>
 	</body>
</html>

结果:

点击提交:

使用表单的 POST 方法实例

post.jsp:

<%@page language="java" contentType="text/html;charset=UTF-8"%>
<%@page pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>GET Page</title>
    </head>
    <body>
    	<h1>使用 POST 方法读取数据</h1>
		<ul>
			<li>
				<p><b>站点名:</b>
					<%
					// 解决中文乱码的问题
					String name = new String((request.getParameter("name")).getBytes("ISO-8859-1"),"UTF-8");
					%>
					<%=name%>
				</p>
			</li>
			<li>
				<p><b>网址:</b>
			   		<%= request.getParameter("url")%>
				</p>
			</li>
		</ul>
 	</body>
</html>

postForm.jsp:

<%@page language="java" contentType="text/html;charset=UTF-8"%>
<%@page pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>GET Page</title>
    </head>
    <body>
    	<h1>使用 POST 方法提交数据</h1>
		<form action="post.jsp" method="post">
			站点名: <input type="text" name="name">
			<br />
			网址: <input type="text" name="url" />
			<input type="submit" value="提交" />
		</form>
 	</body>
</html>

结果:

点击提交进入post.jsp页面

传递 Checkbox 数据到JSP程序

checkBox.jsp

<%@page language="java" contentType="text/html;charset=UTF-8"%>
<%@page pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>POST Page</title>
    </head>
    <body>
    	<h1>使用 POST 方法提交checkBox数据</h1>
		<form action="checkBoxResult.jsp" method="post" target="_blank">
			<input type="checkbox" name="google" checked="checked" /> Google
			<input type="checkbox" name="runoob" /> 菜鸟教程
			<input type="checkbox" name="taobao" checked="checked" /> 淘宝
			<input type="submit" value="选择网站" />
		</form>
 	</body>
</html>

CheckBoxResult.jsp

<%@page language="java" contentType="text/html;charset=UTF-8"%>
<%@page pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>POST Page</title>
    </head>
    <body>
    	<h1>从复选框中读取数据</h1>
		<ul>
			<li><p><b>Google 是否选中:</b>
			   <%= request.getParameter("google")%>
			</p></li>
			<li><p><b>菜鸟教程是否选中:</b>
			   <%= request.getParameter("runoob")%>
			</p></li>
			<li><p><b>淘宝是否选中:</b>
			   <%= request.getParameter("taobao")%>
			</p></li>
		</ul>
		<h1>读取所有表单参数</h1>
		<table width="100%" border="1" align="center">
			<tr bgcolor="#949494">
				<th>参数名</th>
				<th>参数值</th>
			</tr>
			<%
			   Enumeration paramNames = request.getParameterNames();
			
			   while(paramNames.hasMoreElements()) {
			      String paramName = (String)paramNames.nextElement();
			      out.print("<tr><td>" + paramName + "</td>\n");
			      String paramValue = request.getParameter(paramName);
			      out.println("<td> " + paramValue + "</td></tr>\n");
			   }
			%>
		</table>
 	</body>
</html>

结果:

JSP Cookie 处理

cookie.jsp:

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>cookie Page</title>
    </head>
    <body>
    	<form action="cookieResult.jsp" method="GET">
			站点名: <input type="text" name="name">
			<br />
			网址: <input type="text" name="url" />
			<input type="submit" value="提交" />
		</form>
 	</body>
</html>

cookieResult.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.net.*" %>
<%
   // 编码,解决中文乱码   
   String str = URLEncoder.encode(request.getParameter("name"),"utf-8");  
   // 设置 name 和 url cookie 
   Cookie name = new Cookie("name",
           str);
   Cookie url = new Cookie("url",
              request.getParameter("url"));

   // 设置cookie过期时间为24小时。
   name.setMaxAge(60*60*24); 
   url.setMaxAge(60*60*24); 

   // 在响应头部添加cookie
   response.addCookie( name );
   response.addCookie( url );
%>
<html>
	<head>
		<title>设置 Cookie</title>
	</head>
<body>

	<h1>设置 Cookie</h1>

	<ul>
		<li><p><b>网站名:</b>
		   <%= request.getParameter("name")%>
		</p></li>
		<li><p><b>网址:</b>
		   <%= request.getParameter("url")%>
		</p></li>
	</ul>
</body>
</html>

getCookie.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.net.*" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>获取 Cookie</title>
</head>
<body>
<%
   Cookie cookie = null;
   Cookie[] cookies = null;
   // 获取 cookies 的数据,是一个数组
   cookies = request.getCookies();
   if( cookies != null ){
      out.println("<h2> 查找 Cookie 名与值</h2>");
      for (int i = 0; i < cookies.length; i++){
         cookie = cookies[i];
        
         out.print("参数名 : " + cookie.getName());
         out.print("<br>");
         out.print("参数值: " + URLDecoder.decode(cookie.getValue(), "utf-8") +" <br>");
         out.print("------------------------------------<br>");
      }
  }else{
      out.println("<h2>没有发现 Cookie</h2>");
  }
%>
</body>
</html>

结果:

使用 JSP 删除 cookie

deleteCookie.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.net.*" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>获取 Cookie</title>
</head>
<body>
	<%
	   Cookie cookie = null;
	   Cookie[] cookies = null;
	   // 获取当前域名下的cookies,是一个数组
	   cookies = request.getCookies();
	   if( cookies != null ){
	      out.println("<h2> 查找 Cookie 名与值</h2>");
	      for (int i = 0; i < cookies.length; i++){
	         cookie = cookies[i];
	         if((cookie.getName( )).compareTo("name") == 0 ){
	            cookie.setMaxAge(0);
	            response.addCookie(cookie);
	            out.print("删除 Cookie: " + 
	            cookie.getName( ) + "<br/>");
	         }
	         out.print("参数名 : " + cookie.getName());
	         out.print("<br>");
	         out.print("参数值: " + URLDecoder.decode(cookie.getValue(), "utf-8") +" <br>");
	         out.print("------------------------------------<br>");
	      }
	  }else{
	      out.println("<h2>没有发现 Cookie</h2>");
	  }
	%>
</body>
</html>

结果:

访问第一次的时候有name的cookie,第二次就没有了。

JSP Session应用

session.jsp:

<%@page contentType="text/html;charset=UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<%
	// 获取session创建时间
   Date createTime = new Date(session.getCreationTime());
   // 获取最后访问页面的时间
   Date lastAccessTime = new Date(session.getLastAccessedTime());
%>
<html>
  <head></head>
  <body>
  	<%String s = session.getId(); //获取session ID号  %>
    <p>你的session对象ID是:</p>
	<%=s %>  
	<%!
	    int Num = 1; //定义前面要加!号
	    synchronized void countPeople() { //同步方法
	      Num++;
	    }
  	%>
  	<%
	    if (session.isNew()) { //判断是否为新用户
	      countPeople();
	      String str = String.valueOf(Num);
	      session.setAttribute("count", str); //将str 添加到session对象中
	    }else{
	    	session.setAttribute("count", String.valueOf(Num));
	    }
  	%>
  	<p>
	   	创建时间
	   	<% out.print(createTime); %>
    </p>
    <p>
	   	最后访问时间
		<% out.print(lastAccessTime); %>
    </p>
    <p>
	   	你是第
	   		<%=(String)session.getAttribute("count")%>
	   	个访问本站的人
    </p>
    <!--将session对象的count值取出-->
  </body>
</html>

结果:

cookie和session的区别

通俗讲,Cookie是访问某些网站以后在本地存储的一些网站相关的信息,下次再访问的时候减少一些步骤。另外一个更准确的说法是:Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器,是一种在客户端保持状态的方案。

Cookie的主要内容包括:名字,值,过期时间,路径和域。

Session

Session是存在服务器的一种用来存放用户数据的类HashTable结构。

当浏览器 第一次发送请求时,服务器自动生成了一个HashTable和一个Session ID用来唯一标识这个HashTable,并将其通过响应发送到浏览器。当浏览器第二次发送请求,会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和保存的所有Session ID进行对比,找到这个用户对应的HashTable。

一般这个值会有一个时间限制,超时后毁掉这个值,默认是20分钟。

Session的实现方式和Cookie有一定关系。试想一下,建立一个连接就生成一个session id,那么打开几个页面就好几个了,这显然不是我们想要的,那么该怎么区分呢?这里就用到了Cookie,我们可以把session id存在Cookie中,然后每次访问的时候将Session id带过去就可以识别了,是不是很方便~

区别

通过上面的简单叙述,很容易看出来最明显的不同是一个在客户端一个在服务端。因为Cookie存在客户端所以用户可以看见,所以也可以编辑伪造,不是十分安全。

Session过多的时候会消耗服务器资源,所以大型网站会有专门的Session服务器,而Cookie存在客户端所以没什么问题。

域的支持范围不一样,比方说a.com的Cookie在a.com下都能用,而www.a.com的Session在api.a.com下都不能用,解决这个问题的办法是JSONP或者跨域资源共享

JSP 文件上传

基于ssm项目实现jsp的文件上传下载

https://github.com/ChenXbFrank/ssm/tree/devlop 下载代码:

pom.xml:

<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.3.1</version>
		</dependency>

spring-web.xml配置文件上传下载

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<property name="defaultEncoding" value="utf-8"></property>
		<property name="maxUploadSize" value="5242440"></property>    <!--设置最大支持的上传文件大小 B-->
	</bean>

upload.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>文件上传下载</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/file/upload"
      method="post" enctype="multipart/form-data">
    选择文件:<input type="file" name="file" width="120px"> <input
        type="submit" value="上传">
</form>
<hr>
<form action="${pageContext.request.contextPath }/file/download"
      method="get">
    <input type="submit" value="下载">
</form>
</body>
</html>
FileController:
package com.cxb.ssm.web;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;

@Controller
@RequestMapping("/file")
public class FileController {

	private Logger logger = LoggerFactory.getLogger(this.getClass());

	@RequestMapping(value = "/filePage", method = RequestMethod.GET)
	private String filePage() {
		return "upload";
	}

	@RequestMapping(value = "/upload", method = RequestMethod.POST)
	@ResponseBody
	public String upload(MultipartFile file, HttpServletRequest request) throws IOException {
		String path = request.getSession().getServletContext().getRealPath("upload");
		String fileName = file.getOriginalFilename();
		File dir = new File(path,fileName);
		if(!dir.exists()){
			dir.mkdirs();
		}

		file.transferTo(dir);
		logger.info("文件上传.");
		return fileName;
	}

	@RequestMapping(value = "/download", method = RequestMethod.GET)
	public void down(HttpServletRequest request, HttpServletResponse response) throws Exception{

		String fileName = request.getSession().getServletContext().getRealPath("upload")+"/bg_img.png";

		InputStream bis = new BufferedInputStream(new FileInputStream(new File(fileName)));

		String filename = "下载文件.jpg";

		filename = URLEncoder.encode(filename,"UTF-8");

		response.addHeader("Content-Disposition", "attachment;filename=" + filename);

		response.setContentType("multipart/form-data");

		BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
		int len = 0;
		while((len = bis.read()) != -1){
			out.write(len);
			out.flush();
		}
		logger.info("文件下载.");
		out.close();
	}

}

测试:上传成功到tomcat的文件夹下

下载成功



JSP 日期处理

dateFormat.jsp

<%@page language="java" contentType="text/html;charset=UTF-8"%>
<%@page pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<%@ page import="javax.servlet.*,java.text.*" %>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Date Page</title>
    </head>
    <body>
    	<%
		   Date dNow = new Date( );
		   SimpleDateFormat ft = 
		   new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss");
		   out.print( "<h2 align=\"center\">" + ft.format(dNow) + "</h2>");
		%>
 	</body>
</html>

结果:

JSP 重定向

redirect.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<html>
<html>
<head>
<title>页面重定向</title>
</head>
<body>

	<h1>页面重定向</h1>
	
	<%
	   // 重定向到新地址
	   String site = new String("http://www.runoob.com");
	   response.setStatus(response.SC_MOVED_TEMPORARILY);
	   response.setHeader("Location", site); 
	%>

</body>
</html>

结果会重定向到菜鸟教程的页面

JSP点击量统计

statistics.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<html>
<html>
<head>
<title>访问量统计</title>
</head>
<body>
	<%
	    Integer hitsCount = 
	      (Integer)application.getAttribute("hitCounter");
	    if( hitsCount ==null || hitsCount == 0 ){
	       /* 第一次访问 */
	       out.println("欢迎访问菜鸟教程!");
	       hitsCount = 1;
	    }else{
	       /* 返回访问值 */
	       out.println("欢迎再次访问菜鸟教程!");
	       hitsCount += 1;
	    }
	    application.setAttribute("hitCounter", hitsCount);
	%>
	
	<p>页面访问量为: <%= hitsCount%></p>


</body>
</html>

结果:

JSP 自动刷新

autoFlush.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<html>
<head>
	<title>自动刷新实例</title>
</head>
<body>

	<h2>自动刷新实</h2>
	<%
	   // 设置每隔5秒刷新一次
	   response.setIntHeader("Refresh", 5);
	   // 获取当前时间
	   Calendar calendar = new GregorianCalendar();
	   String am_pm;
	   int hour = calendar.get(Calendar.HOUR);
	   int minute = calendar.get(Calendar.MINUTE);
	   int second = calendar.get(Calendar.SECOND);
	   if(calendar.get(Calendar.AM_PM) == 0)
	      am_pm = "AM";
	   else
	      am_pm = "PM";
	   String CT = hour+":"+ minute +":"+ second +" "+ am_pm;
	   out.println("当前时间为: " + CT + "\n");
	%>

</body>
</html>

结果:每隔5秒刷新

JSP发送邮件

基于ssm项目实现jsp的邮件发送

https://github.com/ChenXbFrank/ssm/tree/devlop 下载代码:

pom.xml

<!--发送邮件-->
		<dependency>
			<groupId>javax.mail</groupId>
			<artifactId>mail</artifactId>
			<version>1.4.7</version>
		</dependency>

sendEmail.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>电子邮件发送</title>
    <script type="text/javascript">
        function Checkform(myform){
            for(i=0;i<myform.length;i++){
                if(myform.elements[i].value==""){
                    alert(myform.elements[i].title+"不能为空!");
                    myform.elements[i].focus();
                    return false;
                }
            }
        }
    </script>
</head>
<body>
<form action="${pageContext.request.contextPath }/file/send" method="post" name="form1" id="form" onsubmit="return Checkform(form1)">
    收件人:<input type="text" name="receiver" title="收件人" id="receiver" size="60" value="810464826@qq.com"><p>
    发件人:<input type="text" name="sender" title="发件人" id="sender" size="60"><p>
    授权码:<input type="password" name="password" id="password" title="邮箱授权码" size="60" value="nzzcrklhgwjkbdef"><p>
    主&nbsp;&nbsp;&nbsp;&nbsp;题:<input type="text" name="subject" id="subject" title="邮件主题" size="60"><p>
    内&nbsp;&nbsp;&nbsp;&nbsp;容:<textarea rows="7" cols="59" name="content" id="content" title="邮件内容"></textarea><p>
    <input type="submit" name="submit" value="发送">
    <input type="reset" name="reset" value="重置">
</form>
</body>
</html>

ok.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>发送成功</title>
</head>
<body>
    <h1>发送成功</h1>
</body>
</html>

error.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>发送失败</title>
</head>
<body>
    <h1>发送失败</h1>
</body>
</html>

 FileController:将发送的邮件也写在了文件类里了0.0

@RequestMapping(value = "/sendEmail", method = RequestMethod.GET)
    private String sendEmail() {
        return "sendEmail";
}


@RequestMapping(value = "/send", method = RequestMethod.POST)
	@ResponseBody
	public void send(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();//必须定义在37,38行设置编码格式后边,否则输出中文为???
		String sender = request.getParameter("sender");
		String password = request.getParameter("password");
		String receiver = request.getParameter("receiver");
		String subject = request.getParameter("subject");
		String content = request.getParameter("content");
		//生成SMTP的主机名称
		int n = sender.indexOf("@");
		int m = sender.length();
		String mailserver = "smtp." + sender.substring(n + 1, m);
		//建立邮件会话
		Properties pro = new Properties();
		pro.put("mail.smtp.host", mailserver);
		pro.put("mail.smtp.auth", true);
		Session sess = Session.getInstance(pro);
		sess.setDebug(true);
		MimeMessage message = new MimeMessage(sess);//新建一个消息对象
		try {
			//设置发件人
			InternetAddress sender_address = new InternetAddress(sender);
			message.setFrom(sender_address);
			//设置收件人
			InternetAddress receiver_address = new InternetAddress(receiver);
			message.setRecipient(javax.mail.Message.RecipientType.TO, receiver_address);
//			message.add
			message.setSubject(subject);//设置主题
			message.setText(content);//设置内容  不是setContent
			message.setSentDate(new Date());//设置发送时间
			//发送邮件
			System.out.println("地址为:" + mailserver + " " + sender + " " + password);
			message.saveChanges();//保证报头域同会话内容保持一致
			Transport transport = sess.getTransport("smtp");
			transport.connect(mailserver, sender, password);
			transport.sendMessage(message, message.getAllRecipients());
			transport.close();
			out.print("<script>alert('邮件已发送!');window.location.href='ok.jsp';</script>");
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("发送邮件产生的错误:" + e.getMessage());
			out.print("<script>alert('邮件发送失败!');window.location.href='error.jsp';</script>");
		}
	}

结果:

发送完成。

JSP 标准标签库(JSTL)

比较重要的标签:

保存数据:  <c:set value=""></c:set>  

浏览器输出数据: <c:out  value=""></c:out>

单条件判断  <c:if  test=""></c:if>

多条件判断

          <c:choose></c:choose>

         <c:when  test=""></c:when>

<c:when test=""></c:when>

          <c:otherwise></c:otherwise>

循环数据

          <c:forEach></c:forEach>

          <c:forTokens  items=""  delims=""></c:forTokens>

重定向 :<c:redirect></c:redirect>

<!-- 举例说明-->

<%-- 使用标签 --%>
<%-- set 标签:保存数据(域中) 默认是 page域 --%>

<c:set var="name" value="rose" scope="request"></c:set>

${requestScope.name }
<br />

<%-- 获取数据 从域中
default 是默认值(value是空的时候)
escapeXml 把html标签 当作一个属性 false 不转义 true 转义
--%>
<c:out value="${name }" default="<h3>标题3</h3>" escapeXml="false"></c:out>

<br />

<%--if 但条件判断 --%>

<%
String msg = null;
pageContext.setAttribute("msg", msg);
%>

<c:if test="${empty msg }">
条件成立
</c:if>

<br />

<%--choose 标签 + when 标签 +other wirse标签

多条件判断
--%>

<c:set var="scope" value="86"></c:set>

<c:choose>
<c:when test="${scope>=90 && scope<=100}">
优秀
</c:when>
<c:when test="${scope>=80 &&scope<90 }">
良好
</c:when>
<c:when test="${scope>=70 &&scope<80 }">
一般
</c:when>
<c:when test="${scope>=60 &&scope<70 }">
及格
</c:when>
<c:otherwise>
不及格
</c:otherwise>
</c:choose>

<br>

<%
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
pageContext.setAttribute("list", list);
%>

<%-- 循环
begin 从那个原色开始遍历
end 哪个元素开始结束
step 步长 (每次加几)
items 需要遍历的数据(集合)
var 每个元素的名称
varStatus 当前正在遍历元素的状态对象。 (count属性:当前位置,从1开始)
--%>

<c:forEach begin="0" end="2" step="1" items="${list}" var="str"
varStatus="varState">
<!-- 序号:${varState.count} - 内容:${str}<br/>-->
<c:out value="序号:${varState.count} - 内容:${str}"></c:out>
<br>
</c:forEach>



<br>
<!-- 测试 -->

<%
Map<String, String> map = new HashMap<String, String>();
map.put("100", "aaa");
map.put("101", "bbb");
map.put("102", "ccc");
pageContext.setAttribute("map", map);
%>

<c:forEach items="${map }" var="entry">
<c:out value="键${entry.key }:值 ${entry.value }"></c:out>
<br>
</c:forEach>

<!--字符串分割 和 javase的split 同样的效果-->

<%
String str = "java-php-net-平面";
pageContext.setAttribute("str", str);
%>

<c:forTokens items="${str }" delims="-" var="s">
${s}<br>
</c:forTokens>


<!-- 重定向 -->
<%-- <c:redirect url="http://www.baidu.com"></c:redirect> --%>

JSP 表达式语言

JSP表达式语言(EL)使得访问存储在JavaBean中的数据变得非常简单。JSP EL既可以用来创建算术表达式也可以用来创建逻辑表达式。在JSP EL表达式内可以使用整型数,浮点数,字符串,常量true、false,还有null。


一个简单的语法

典型的,当您需要在JSP标签中指定一个属性值时,只需要简单地使用字符串即可:

<jsp:setProperty name="box" property="perimeter" value="100"/>

JSP EL允许您指定一个表达式来表示属性值。一个简单的表达式语法如下:

${expr}

其中,expr指的是表达式。在JSP EL中通用的操作符是 . 和 {} 。这两个操作符允许您通过内嵌的JSP对象访问各种各样的JavaBean属性。

举例来说,上面的<jsp:setProperty>标签可以使用表达式语言改写成如下形式:

<jsp:setProperty name="box" property="perimeter" 
                 value="${2*box.width+2*box.height}"/>

当JSP编译器在属性中见到"${}"格式后,它会产生代码来计算这个表达式,并且产生一个替代品来代替表达式的值。

您也可以在标签的模板文本中使用表达式语言。比如<jsp:text>标签简单地将其主体中的文本插入到JSP输出中:

<jsp:text>
<h1>Hello JSP!</h1>
</jsp:text>

现在,在<jsp:text>标签主体中使用表达式,就像这样:

<jsp:text>
Box Perimeter is: ${2*box.width + 2*box.height}
</jsp:text>

在EL表达式中可以使用圆括号来组织子表达式。比如${(1 + 2) * 3}等于9,但是${1 + (2 * 3)} 等于7。

想要停用对EL表达式的评估的话,需要使用page指令将isELIgnored属性值设为true:

<%@ page isELIgnored ="true|false" %>

这样,EL表达式就会被忽略。若设为false,则容器将会计算EL表达式。


EL中的基础操作符

EL表达式支持大部分Java所提供的算术和逻辑操作符:

操作符描述
.访问一个Bean属性或者一个映射条目
[]访问一个数组或者链表的元素
( )组织一个子表达式以改变优先级
+
-减或负
*
/ or div
% or mod取模
== or eq测试是否相等
!= or ne测试是否不等
< or lt测试是否小于
> or gt测试是否大于
<= or le测试是否小于等于
>= or ge测试是否大于等于
&& or and测试逻辑与
|| or or测试逻辑或
! or not测试取反
empty测试是否空值

JSP EL中的函数

JSP EL允许您在表达式中使用函数。这些函数必须被定义在自定义标签库中。函数的使用语法如下:

${ns:func(param1, param2, ...)}

ns指的是命名空间(namespace),func指的是函数的名称,param1指的是第一个参数,param2指的是第二个参数,以此类推。比如,有函数fn:length,在JSTL库中定义,可以像下面这样来获取一个字符串的长度:

${fn:length("Get my length")}

要使用任何标签库中的函数,您需要将这些库安装在服务器中,然后使用<taglib>标签在JSP文件中包含这些库。


JSP EL隐含对象

JSP EL支持下表列出的隐含对象:

隐含对象描述
pageScopepage 作用域
requestScoperequest 作用域
sessionScopesession 作用域
applicationScopeapplication 作用域
paramRequest 对象的参数,字符串
paramValuesRequest对象的参数,字符串集合
headerHTTP 信息头,字符串
headerValuesHTTP 信息头,字符串集合
initParam上下文初始化参数
cookieCookie值
pageContext当前页面的pageContext

您可以在表达式中使用这些对象,就像使用变量一样。接下来会给出几个例子来更好的理解这个概念。


pageContext对象

pageContext对象是JSP中pageContext对象的引用。通过pageContext对象,您可以访问request对象。比如,访问request对象传入的查询字符串,就像这样:

${pageContext.request.queryString}

Scope对象

pageScope,requestScope,sessionScope,applicationScope变量用来访问存储在各个作用域层次的变量。

举例来说,如果您需要显式访问在applicationScope层的box变量,可以这样来访问:applicationScope.box。


param和paramValues对象

param和paramValues对象用来访问参数值,通过使用request.getParameter方法和request.getParameterValues方法。

举例来说,访问一个名为order的参数,可以这样使用表达式:${param.order},或者${param["order"]}。

接下来的例子表明了如何访问request中的username参数:

<%@ page import="java.io.*,java.util.*" %>
<%
    String title = "Accessing Request Param";
%>
<html>
<head>
<title><% out.print(title); %></title>
</head>
<body>
<center>
<h1><% out.print(title); %></h1>
</center>
<div align="center">
<p>${param["username"]}</p>
</div>
</body>
</html>

param对象返回单一的字符串,而paramValues对象则返回一个字符串数组。


header和headerValues对象

header和headerValues对象用来访问信息头,通过使用 request.getHeader方法和request.getHeaders方法。

举例来说,要访问一个名为user-agent的信息头,可以这样使用表达式:${header.user-agent},或者${header["user-agent"]}。

接下来的例子表明了如何访问user-agent信息头:

<%@ page import="java.io.*,java.util.*" %>
<%
    String title = "User Agent Example";
%>
<html>
<head>
<title><% out.print(title); %></title>
</head>
<body>
<center>
<h1><% out.print(title); %></h1>
</center>
<div align="center">
<p>${header["user-agent"]}</p>
</div>
</body>
</html>

运行结果如下:

jsp-expression-language

header对象返回单一值,而headerValues则返回一个字符串数组。

 

实例demo的下载:https://github.com/ChenXbFrank/jsp-learn

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值