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所支持的九大隐式对象:
对象 | 描述 |
---|---|
request | HttpServletRequest 接口的实例 |
response | HttpServletResponse 接口的实例 |
out | JspWriter类的实例,用于把结果输出至网页上 |
session | HttpSession类的实例 |
application | ServletContext类的实例,与应用上下文有关 |
config | ServletConfig类的实例 |
pageContext | PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问 |
page | 类似于Java类中的this关键字 |
Exception | Exception类的对象,代表发生错误的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
通俗讲,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>
主 题:<input type="text" name="subject" id="subject" title="邮件主题" size="60"><p>
内 容:<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支持下表列出的隐含对象:
隐含对象 | 描述 |
---|---|
pageScope | page 作用域 |
requestScope | request 作用域 |
sessionScope | session 作用域 |
applicationScope | application 作用域 |
param | Request 对象的参数,字符串 |
paramValues | Request对象的参数,字符串集合 |
header | HTTP 信息头,字符串 |
headerValues | HTTP 信息头,字符串集合 |
initParam | 上下文初始化参数 |
cookie | Cookie值 |
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>
运行结果如下:
header对象返回单一值,而headerValues则返回一个字符串数组。
实例demo的下载:https://github.com/ChenXbFrank/jsp-learn