JSP(六)

JSP 文件上传

JSP可以通过HTMLform表单上传文件到服务器。 文件类型可以是文本文件、二进制文件、图像文件等其他任何文档。 

 

 

--------------------------------------------------------------------------------

 

创建文件上传表单

接下来我们使用HTML标签来创建文件上传表单,以下为要注意的点:

 

form表单 method 属性必须设置为 POST 方法 ,不能使用 GET 方法。 

form表单 enctype 属性需要设置为 multipart/form-data。 

form表单 action 属性需要设置为提交到后台处理文件上传的jsp文件地址。例如 uploadFile.jsp 程序文件用来处理上传的文件。 

上传文件元素需要使用 <input .../> 标签,属性设置为 type="file"。如果需要上传多个文件,可以在 <input .../>标签中设置不同的名称。 

以下是一个上传文件的表单,实例如下:

 

<html>

<head>

<title>File Uploading Form</title>

</head>

<body>

<h3>File Upload:</h3>

Select a file to upload: <br />

<form action="UploadServlet" method="post"

                        enctype="multipart/form-data">

<input type="file" name="file" size="50" />

<br />

<input type="submit" value="Upload File" />

</form>

</body>

</html>

在你本地浏览器访问该文件,显示界面如下所示,在你点击"Upload File"会弹出一个窗口让你选择要上传的文件

 

 

 

后台JSP处理脚本

首先我们先定义文件上传后存储在服务上的位置,你可以将路径写在你的程序当中,或者我们可以在web.xml配置文件中通过设置 context-param 元素来设置文件存储的目录,如下所示:

 

<web-app>

....

<context-param> 

    <description>Location to store uploaded file</description> 

    <param-name>file-upload</param-name> 

    <param-value>

         c:\apache-tomcat-5.5.29\webapps\data\

     </param-value> 

</context-param>

....

</web-app>

以下脚本文件UploadFile.jsp可以处理多个上传的文件,在使用该脚本前,我们需要注意以下几点:

 

以下实例依赖 FileUpload, 所以你需要在你的classpath中引入最新的 commons-fileupload.x.x.jar 包文件。 下载地址为:http://commons.apache.org/fileupload/。 

FileUpload 依赖 Commons IO, 所以你需要在你的classpath中引入最新的 commons-io-x.x.jar 。 下载地址为: http://commons.apache.org/io/。 

在测试以下实例时,你需要上传确认上传的文件大小小于 maxFileSize 变量设置的大小 ,否则文件无法上传成功。 

确保你已经创建了目录 c:\temp 和 c:\apache-tomcat-5.5.29\webapps\data 。 

<%@ 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");

 

   // 验证上传内容了类型

   String contentType = request.getContentType();

   if ((contentType.indexOf("multipart/form-data") >= 0)) {

 

      DiskFileItemFactory factory = new DiskFileItemFactory();

      // 设置内存中存储文件的最大值

      factory.setSizeThreshold(maxMemSize);

      // 本地存储的数据大于 maxMemSize.

      factory.setRepository(new File("c:\\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>");

   }

%>


JSP 日期处理

使用JSP最重要的优势之一,就是可以使用所有Java  API。本章将会详细地讲述Java中的Date类,它在java.util包下,封装了当前日期和时间。

 

Date类有两个构造函数。第一个构造函数使用当前日期和时间来初始化对象。

 

Date( )

第二个构造函数接受一个参数,这个参数表示从197011日凌晨至所要表示时间的毫秒数。

 

Date(long millisec)

获取Date对象后,您就能够使用下表列出的所有方法:

 

序号

方法 & 描述

1

boolean after(Date date) 

如果比给定的日期晚,则返回true,否则返回false

2

boolean before(Date date) 

如果比给定的日期早,则返回true,否则返回false

3

Object clone( ) 

获取当前对象的一个副本

4

int compareTo(Date date) 

如果与给定日期相等,则返回0,如果比给定日期早,则返回一个负数,如果比给定日期晚,则返回一个正数

5

int compareTo(Object obj) 

与 compareTo(Date) 方法相同,如果 obj 不是Date类或其子类的对象,抛出ClassCastException异常

6

boolean equals(Object date) 

如果与给定日期相同,则返回true,否则返回false

7

long getTime( ) 

返回从1970年1月1日凌晨至此对象所表示时间的毫秒数

8

int hashCode( ) 

返回此对象的哈希码

9

void setTime(long time) 

使用给定参数设置时间和日期,参数time表示从1970年1月1日凌晨至time所经过的毫秒数

10

String toString( ) 

将此对象转换为字符串并返回这个字符串

 

获取当前日期和时间

使用JSP编程可以很容易的获取当前日期和时间,只要使用Date对象的toString()方法就行了,就像下面这样:

 

<%@ page import="java.io.*,java.util.*, javax.servlet.*" %>

<html>

<head>

<title>Display Current Date & Time</title>

</head>

<body>

<center>

<h1>Display Current Date & Time</h1>

</center>

<%

   Date date = new Date();

   out.print( "<h2 align=\"center\">" +date.toString()+"</h2>");

%>

</body>

</html>

将上面的代码保存在CurrentDate.jsp文件中,然后访问http://localhost:8080/CurrentDate.jsp,运行结果如下: 

 

Display Current Date & Time

Mon Jun 21 21:46:49 GMT+04:00 2013

刷新http://localhost:8080/CurrentDate.jsp,就可以发现每次刷新所得到的秒数都不相同。

 

 

日期比较

就像我在开头所提到的,您可以在JSP脚本中使用任何Java方法。如果您想要比较两个日期,

 

可以参照下面的方法来做:

 

使用getTime()方法得到毫秒数,然后比较毫秒数就行了。 

使用before()after()equals()方法。比如,new Date(99,2,12).before(new Date(99,2,18))返回true。 

使用compareTo()方法,这个方法在Comparable接口中定义,在Date中实现。

 

 

使用SimpleDateFormat格式化日期

SimpleDateFormat使用一种地区敏感的方式来格式化和解析日期,它允许您使用自定义的模式来格式化日期和时间。

 

CurrentDate.jsp稍作修改,得到如下修改后的代码:

 

<%@ page import="java.io.*,java.util.*" %>

<%@ page import="javax.servlet.*,java.text.*" %>

<html>

<head>

<title>Display Current Date & Time</title>

</head>

<body>

<center>

<h1>Display Current Date & Time</h1>

</center>

<%

   Date dNow = new Date( );

   SimpleDateFormat ft = 

   new SimpleDateFormat ("E yyyy.MM.dd 'at' hh:mm:ss a zzz");

   out.print( "<h2 align=\"center\">" + ft.format(dNow) + "</h2>");

%>

</body>

</html>

再次编译CurrentDate.jsp,然后访问http://localhost:8080/CurrentDate.jsp,就可以得到如下结果: 

Display Current Date & TimeMon 2013.06.21 at 10:06:44 PM GMT+04:00

 

 

 

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

"

单引号

`

 

 

 

 

 

 

 

 

 

JSP 点击量统计

有时候我们需要知道某个页面被访问的次数,这时我们就需要在页面上添加页面统计器,页面访问的统计一般在用户第一次载入时累加该页面的访问数上。

 

要实现一个计数器,您可以利用应用程序隐式对象和相关方法getAttribute()setAttribute()来实现。

 

这个对象表示JSP页面的整个生命周期中。当JSP页面初始化时创建此对象,当JSP页面调用jspDestroy()时删除该对象。

 

以下是在应用中创建变量的语法:

 

application.setAttribute(String Key, Object Value);

您可以使用上述方法来设置一个计数器变量及更新该变量的值。读取该变量的方法如下:

 

application.getAttribute(String Key);

在页面每次被访问时,你可以读取计数器的当前值,并递增1,然后重新设置,在下一个用户访问时就将新的值显示在页面上。

 

 

--------------------------------------------------------------------------------

 

实例演示

该实例将介绍如何使用JSP来计算特定页面访问的总人数。如果你要计算你网站使用页面的总点击量,那么你就必须将该代码放在所有的JSP页面上。

 

<%@ page import="java.io.*,java.util.*" %>

 

<html>

<head>

<title>Applcation object in JSP</title>

</head>

<body>

<%

    Integer hitsCount = 

      (Integer)application.getAttribute("hitCounter");

    if( hitsCount ==null || hitsCount == 0 ){

       /* 第一次访问 */

       out.println("Welcome to my website!");

       hitsCount = 1;

    }else{

       /* 返回访问值 */

       out.println("Welcome back to my website!");

       hitsCount += 1;

    }

    application.setAttribute("hitCounter", hitsCount);

%>

<center>

<p>Total number of visits: <%= hitsCount%></p>

</center>

</body>

</html>

现在我们将上面的代码放置于main.jsp文件上,并访问http://localhost:8080/main.jsp文件。你会看到页面会生成个计数器,在我们每次刷新页面时,计数器都会发生变化(每次刷新增加1)。 你也可以通过不同的浏览器访问,计数器会在每次访问后增加1

 

 

 

JSP 自动刷新

想象一下,如果要直播比赛的比分,或股票市场的实时状态,或当前的外汇配给,该怎么实现呢?显然,要实现这种实时功能,您就不得不规律性地刷新页面。

 

JSP提供了一种机制来使这种工作变得简单,它能够定时地自动刷新页面。

 

刷新一个页面最简单的方式就是使用response对象的setIntHeader()方法。这个方法的签名如下: 

 

public void setIntHeader(String header, int headerValue)

这个方法通知浏览器在给定的时间后刷新,时间以秒为单位。

 

 

--------------------------------------------------------------------------------

 

页面自动刷新程序示例

这个例子使用了setIntHeader()方法来设置刷新头,模拟一个数字时钟:

 

<%@ page import="java.io.*,java.util.*" %>

<html>

<head>

<title>Auto Refresh Header Example</title>

</head>

<body>

<center>

<h2>Auto Refresh Header Example</h2>

<%

   // Set refresh, autoload time as 5 seconds

   response.setIntHeader("Refresh", 5);

   // Get current time

   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("Crrent Time: " + CT + "\n");

%>

</center>

</body>

</html>

把以上代码保存在main.jsp文件中,访问它。它会每隔5秒钟刷新一次页面并获取系统当前时间。运行结果如下:

 

Auto Refresh Header Example

Current Time is: 9:44:50 PM




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值