jsp&servlet学习笔记

1、路径引用问题

一个cssjsphtml、或者javascript文件从从一个工程复制到另一工程,如果引用的时候使用的时相对路径,看似没有错误,但是却一直引用不进来,这时候要使用绝对路径,这样才能将原来的工程名改成现在的工程;

2.el处理form表单数据问题

我们常用: 
   request.getParameter(String name)和
   request.getParameterValues(String name)
取得用户在表单中输入的数据,但在EL中可以使用隐含对象param和
paramValues来取得数据。如下所示:
    ${param.name}
   ${paramValues.name}
   
这里param的功能和request.getParameter(String name}相同,
而paramValues
和request.getParameterValues(String name)相同。
请看例子:
表单(Form.html)
<html>
<head>
  <title>Form.html</title>

<meta http-equiv="Content-Type" content="text/html; charset=GB2312"> </head>
<body>
<form name="Example" method="post" action="Form.jsp">
<p> 姓名:<input type="text" name="Name" size="15" maxlength="15"></p>
<p> 密码:<input type="password" name="Password" size="15" maxlength="15"></p>
<p> 性别:<input type="radio" name="Sex" value="Male" checked>男 
   <input type="radio" name="Sex" value="Female">女</p>
<p> 年龄: 
    <select name="Old">
      <option value="10">10 ~ 20</option>
      <option value="20" selected>21 ~ 30</option>
      <option value="30">31 ~ 40</option>
      <option value="40">41 ~ 65</option>
    </select>
  </p>
  <p> 兴趣: 
    <input type="checkbox" name="Habit" value="Read">
    看书 
    <input type="checkbox" name="Habit" value="Game">
    电玩 
    <input type="checkbox" name="Habit" value="Travel">
    旅游 
    <input type="checkbox" name="Habit" value="Music">
    听音乐 
    <input type="checkbox" name="Habit" value="Tv">
    看电视</p>
<p> 
<input type="submit" value="提交">
  <input type="reset" value="清除">
</p>
</form>

</body>
</html>

二、处理表单的JSP文件

<%@ page contentType="text/html;charset=GB2312" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<html>
<head>
<title>CH9 - Form.jsp</title>
</head>
<body>

<h2>使用 EL、JSTL 处理表单数据</h2>
<fmt:requestEncoding value="GB2312" />

姓名:<c:out value="${param.Name}" default="Nothing" /> <br>
密码:<c:out value=" ${param.Password} " default="Nothing" /><br>
性别:<c:if test="${param.Sex == 'Male'}">男<br></c:if>
<c:if test="${param.Sex == 'Female'}">女<br></c:if>
年龄:<c:choose>
<c:when test="${param.Old == 10}">10 ~ 20<br></c:when>
<c:when test="${param.Old == 20}">21 ~ 30<br></c:when>
<c:when test="${param.Old == 30}">31 ~ 40<br></c:when>
<c:otherwise>41 ~ 65<br></c:otherwise>
</c:choose>
兴趣:<c:forEach items="${paramValues.Habit}" var="habit">
<c:choose>
<c:when test="${habit == 'Read'}"><li>看书1</li></c:when>
<c:when test="${habit == 'Game'}"><li>电玩</li></c:when>
<c:when test="${habit == 'Travel'}"><li>旅游</li></c:when>
<c:when test="${habit == 'Music'}"><li>听音乐</li></c:when>
<c:when test="${habit == 'Tv'}"><li>看电视</li></c:when>
</c:choose>
</c:forEach>
</body>
</html>

2、乱码问题:

Get:要设置好request 和 responsesetCharacterEncoding(“utf-8”);

除此之外,还要在server.xml 的 connector标签添加一行 URIEncoding = “utf-8”;

3、String->JsonObject

package package_1;

import java.lang.StringBuffer;

import java.awt.Window.Type;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.BufferedReader;

import java.net.URL;

import net.sf.json.JSONObject;

import com.google.gson.Gson;

import com.google.gson.JsonObject;

import com.google.gson.JsonParser;

import com.google.gson.JsonElement;

 

public class ChinaWeatherAPI {

public static void main(String[] args){

String jsonString = "{\"field1\":\"value1\",\"field2\":\"value2\"}";

JsonParser parser = new JsonParser();

JsonObject jo = (JsonObject)parser.parse(jsonString);

JsonElement ele = jo.get("field1");

String value1 = ele.getAsString();

}

}

4、html标签到后台的形式

4.1  Select : 选中的optiontext , 如果被选中的optionvalue属性有值,那么就是value

4.2  checkbox : 获取方式必须是getParameterValues , 得出是一个数组,装载着所有打勾的checkbox 

 

5.JSP学习笔记

JSP动作元素

将 一些常用的JSP动作标记写下来,虽然自己大致都知道如何使用,但对于其中的一些细节可能并非清楚!
<jsp:param>
jsp:param操作被用来以“名-值”对的形式为其他标签提供附加信息。写一般与<jsp:forward><jsp:include>,<jsp:plug>,一起使用。
它的使用方式如下:
<jsp:param name="paramName"  value="paramValue"/>

<jsp:include>
该操作允许在请求的时间内在现成的JSP页面里面包含静态或动态的资源。被访问的对象对JSP write对象的访问权,并且它不能设置头或者Cookie.如果页面输出是缓冲的,那么缓冲区的刷新要俦于包含的刷新。因此它在运行效率上比<%@   include  file="include.html"%>要低,但它可以动态增加内容,使用例子如下:


<%@ page contentType="text/html; charset=gb2312" language="java" %>
<html>
<body>
<%@ include file="static.html" %>
<%--只是把文件包含进来--%>
<a href="two.jsp">goto two--></a><br>
this examples show include works
<jsp:include page="two.jsp" flush="true">
<jsp:param name="a1" value="<%=request.getParameter("name")%>" />
<jsp:param name="a2" value="<%=request.getParameter("password")%>" />
</jsp:include>
</body>
</html>


<html>
<body>
<form method=post action="jsp_include.jsp">
<table>
<tr><td>please input your name:</td></tr>
<tr><td><input type=text name=name></td></tr>
<tr><td>input you password:</td></tr>
<tr><td><input type=text name=password></td></tr>
<tr><td><input type=submit value=login></td></tr>
</table>
</body>
</html>


<%@ page contentType="text/html; charset=gb2312" language="java" %>
<%-- 上面一行声明需要加上 虽然在主页面已经加入,若不加则会是乱码--%>
举例说明include的工作原理:
<br>
this is a1=<%=request.getParameter("a1")%>
<br>
this is a2=<%=request.getParameter("a2")%>
<br>
<% out.println("hello from two.jsp");%>


<jsp:forword>
该操作允许将请求转发到另一个JSPServlet或者静态资源文件。一旦遇上此标记即会停止执行当前的JSP,转而执行被转发的资源。
使用示例如下:


<%@ page contentType="text/html; charset=gb2312" %>
<html>
<body>
<form method=get action=checklogin.jsp>
<table>
<tr><td>输入用户名:</td>
<td><input type=text name=name value=<%=request.getParameter("name")%>></td>
</tr>
<tr><td>输入密码:</td>
<td><input type=password name=password></td>
</tr>
<tr colspan=2><td><input type=submit value=login></td></tr>
</table>
</body>
</html>


<%@ page contentType="text/html; charset=gb2312" %>
<html>
<body>
<%--进行登陆检查--%>
<%
   String name=request.getParameter("name");
  // String password=request.getParameter("password");
   // if验证通过,forward-->sucess.jsp
   //else forward-->login.jsp
   if(name.equals("hellking"))
   {
%> 
<jsp:forward page="sucess.jsp">
<jsp:param name="user" value="<%=name%>"/>
</jsp:forward>
<%
 }//if
 else
 {
%>
<jsp:forward page="login.jsp">
<jsp:param name="user" value="<%=name%>"/>
</jsp:forward>
 <%}%>
</body>
</html>


<%@ page contentType="text/html; charset=gb2312" %>
登录成功
<BR>
欢迎你,
<%=request.getParameter("name") %>

<jsp:setProperty>
此操作与useBean协作,用来设置Bean的简单属性和索引属性。<jsp:setProperty>标签使用BeansetXXX()方法。利用它设置属性多种方法。
Bean的自省(introspection)用来发现出现的是哪些属性和它们的名字是什么,这些属性是简单的还是索引的,它们有什么类型等,用以下方法使用setProperty:
<jsp:setProperty name="beanName" property="*"/>

 <jsp:setProperty name="beanName" property="propertyName" param="parameterName"/>
 或
 <jsp:setProperty name="beanName" property="propertyName"/>
 或
 <jsp:setProperty name="beanName"  property="propertyName" value="propertyValue"/>
name="beanName"这是个必须属性,其值为Bean的名字,是在这之前用<jsp:useBean>的引入名称。
在所有使用没有 value属性的方式时要特别注意value的引用属性名一定要与Bean中定义的属性名严格一致!否则可能达不到预期效果!
另外从客户端传到器上的参数字符串型,这些字符串为了能够在Bean中匹配就需要罪魁成对应的类型。下面列出转换方法:
boolean      java.lang.Boolean.valueOf(String).booleanValue()
Boolean      java.lang.Boolean.valueOf(String)
byte        java.lang.Byte.valueOf(String).byteValue();
Byte        java.lang.Byte.valueOf(String)
char        java.lang.Character.valueOf(String).charValue();
Character     java.lang.Character.valueOf(String)
double       java.lang.Double.valueOf(String).doubleValue()
Double      java.lang.Double.valueOf(String)
int         java.lang.Integer.valueOf(String).intValue()
Integer      java.lang.Integer.valueOf(String)
float        java.lang.Float.valueOf(String).floatValue()
Float       java.lang.Float.valueOf(String)
long        java.lang.Long.valueOf(String).longValue()
Long       java.lang.Long.valueOf(String)

<jsp:getProperty>
此操作是对<jsp:setProperty>操作的补充,它用来访问一个Bean的属性。它访问的属性值将它转化成一个String,然后发送到输出流中。如果属性是一个对象,将调用toString()方法,它的使用如下:
<jsp:getProperty name="beanName" property="propertyName">
它也同样与jsp:useBean一起使用。,同时它也有一些限制,如:不能使用它来检索一个已经被索引了的属性。

<jsp:useBean>
此标签用于在JSP页面中创建一个Bean实例,并指定它的名字及作用范围。它保证对象在标签指定的范围内可以使用。
它的使用例子如下:
<jsp:useBean id="shopcar" scope="session" class="sessopn.Carts"/>
<jsp:setProperty name="shopcart" property="*"/>

<jsp:useBean id="checking" scope="session" class="bank.Checking">
<jsp:setProperty name="checking" property="balance" value="0.0"/>
</jsp:useBean>
scope的取值可以是page/request/session/application 范围依次递增!
可以分别使用
//page 中直接使用checking即可!
request.getAttribute("checking")
session.getValue("checking")
application.getAttribute("checking")
另外除了以上属性useBean还有以下属性
class="className"
这是Bean的类路径和类名。这个class不能是抽象的,必须有一个公用的,无参数的构造器。
BeanName="beanName"  type="typeName"
使用instantiate方法从一个class中实例化一个Bean,同时还可以指定 Bean的类型
type="typeName"
type可以是一个类本身,也可以是一个类的父类,或者是一个类的接口。如果没有使用classBeanName指定typeBean将不会被 实例化
另外不能同时使用 classBeanNameBeanName的是Bean的名字,它的形式为"a.b.c"

下面是一个具体的程序示例:

用户信息JavaBean TestBean.java

用户注册界面中的表单register.html

信息注册代码register.jsp

<jsp:plugin>
此操作是用来产生客户端浏览器的特别标签(Object或者embed),可以使用它来插入Applet或者JavaBean
一般来说<jsp:plugin>元素指定的对象是Applet还是Bean,同样也会指定class的名字,另外还会指定将从哪里下载这个Java插件。

<jsp:plugin type=applet  code="efly.testMyApplet.class"  codebase=".">
    <jsp:params>
            <jsp:param  name="aParameterName"  value="aParameterNameValue"/>
    </jsp:params>
    <jsp:fallback>
            <p>Unable  to  load  applet.</p>
    </jsp:fallback>
</jsp:plugin>

解释:
1type="bean/applet"
2code="classFileName"  插件执行JAVA类文件的名称。在名称中必须加上扩展名,且此文件必须放在用 codebase属性的目录下。
3codebase="classFileDirectoryName"这包含插件将运行的JAVA类的目录或指向这个目录的路径。默认为JSP文件的当前路径。
4name="instanceName" 这是BeanApplet的实例的名称。使得被同一个JSP文件调用的BeanApplet之间的通讯成为可能。
5archive="URIToArchive,……"这是以逗号分隔的路径名列表,是那些用于codebase指定的目录下的类装载器预装载的存档文件所在的路径名。
6align="botton/top/middle/left/right"图形,对象,Applet的排列方式。
7height="displayPixels"  width="displayPixels"  显示的高宽
8hspace="leftRightPixels"  vspace="topBottomPixels"  左右  上下留下空间大小
9jreversion="JREVersionNumber | 1.1" 这是AppletBean运行时所需的JRE版本
10nspluginurl="URLToPlugin" 这是Netscape Navigator用户能够使用的JRE下载地址
11iepluginurl="URLToPlugin" 这是Internet Explorer用户能够使用的JRE下载地址
12<jsp:params>表示需要向AppletBean传送的参数或值
13<jsp:fallback>回滚,下载失败则显示里面的内容,此标记只能在<jsp:plugin>内部使用

下面做一个具体的例子来结束这篇笔记!

 


package eflylab;
import javax.swing.*;
import java.awt.*;
/**
 * @author fengyan
 * @date    2007-01-15 23:36
 */
public class MyApplet extends JApplet {
    String img;
    public void paint(Graphics g)
    {
        Image image=getImage(getCodeBase(),img);
        g.drawImage(image,0,0,400,400,this);//绘制一张图片
        g.setColor(Color.blue);
        g.setFont(new Font("宋体",2,24));
        g.drawString("使用JSP:PLUGINJSP中添加applet",40,170);//绘制一个字符串
        g.setFont(new Font("NewsRoman",2,10));
        g.setColor(Color.pink);
        g.drawString(new java.util.Date().toString() ,10,190);//绘制一个字符串
    }
    public void init()
    {
        img=getParameter("image");
    }

 


 
<html>
<head><title>jsp:plugin 演示</title></head>
<body>
<hr><br>
<jsp:plugin type="applet" code="eflylab.MyApplet"
codebase="." align="center" width="400" height="400">
<jsp:params>
<jsp:param name="image" value="pic.jpg"/>
</jsp:params>
<jsp:fallback>在插入applet时产生错误 </jsp:fallback>
</jsp:plugin>
</body>
</html>

 

http://www.cnblogs.com/eflylab/archive/2007/01/16/621241.html

 

 

2. EL使用

 

EL基本用法

分类: JaveEE2010-03-31 16:26 1594人阅读 评论(0) 收藏 举报

applicationsessionstringjsphtmlencoding

概述

EL是在web前端经常会用到的技术,EL经常和JSTL一起使用,但是EL又可以单独使用,全称是Expression Language,它原本是JSTL 1.0为方便存取数据所定义的语言,是一种新的语言,有它自己的语法,只要支持Servlet2.4或者JSP2.0的容器,都可以在JSP网页中直接使用EL,不需导入任何其他的包。

优势

JSP中,经常会打印一些变量的内容,这些变量可以是从某个范围中变量,比如pagerequestsessionapplication范围。例,打印str变量,下面三种方法都可以:

<%out.println(str)%>,这样会使JSP页面里面包含JAVA代码;

<%=str%>只能从本地获得,如果要从session里面获取必须是<%=session.getAttribute()%>

${str}则可以从requestsessionapplication范围中获得。

EL语法

 

 

 

 

 

 

 

 

 

 

EL的语法很简单,最大的特点就是使用上很方便。所有的EL都是以 ${ 为起始、以 为结尾的。

例如:${sessionScope.user.sex},表示从session的范围中,取得用户的性别。如果使用JSP Scriptlet的写法如下:

User user = (User)session.getAttribute(user);

String sex = user.getSex();

out.print(sex);

使用这种方法就会使JSP中包含JAVA代码,而且很麻烦。

EL提供 和 [ ] 两种运算符来存取数据。下面两种所代表的意思是一样的。

${sessionScope.user.sex}等于${sessionScope.user[sex]}

但是使用 [ ] 的范围更广,因为 [ ] 中还可以是变量,比如:

String str = sex;

${sessionScope.user[str]}

和 [ ] 的混合使用,获取集合中元素的值,例如:

${sessionScope.shoppingCart[0].price}表示结果为shoppingCart中第一项物品的价格。

几个重要的EL隐含对象

 

 

pageScope,取得page范围的属性名称所对应的值。

requestScope,取得request范围的属性名称所对应的值。

sessionScope,取得session范围的属性名称所对应的值。

applicationScope,取得application范围的属性名称所对应的值。

param,如同ServletReqest.getParameter(String name)

cookie,如同HttpServletRequest.getCookie()

initParam,如同ServletContext.getInitParameter(String name)

获取requestsessionapplication中的值 

新建项目ELPro,新建页面PageA.jspPageB.jsp

PageA.jsp

[xhtml] view plaincopy

 

1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  

2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  

3 <html>  

4   <head>  

5     <title>My JSP 'PageA.jsp' starting page</title>  

6   </head>  

7   <body>  

8     <%  

9         application.setAttribute("msgA", "Welcome Application!");//application内放一些内容  

10         session.setAttribute("msgS", "Welcome Session!");//session内放一些内容  

11         request.setAttribute("msgR", "Welcome Request!");//request内放一些内容  

12     %>  

13     <a href="PageB.jsp" mce_href="PageB.jsp">进入PageB页面</a>  

14   </body>  

15 </html>  

 PageB.jsp

[xhtml] view plaincopy

 

16 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  

17 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  

18 <html>  

19   <head>  

20     <title>My JSP 'PageB.jsp' starting page</title>  

21   </head>  

22   <body>  

23     application中的内容:${applicationScope.msgA }<br/>  

24     session中的内容:${sessionScope.msgS }<br/>  

25     request中的内容:${request.msgR }<br/>  

26   </body>  

27 </html>  

 

 

 

 

运行页面,在PageB.jsp显示如下

 

 

 

 

 

application中的内容:Welcome Application!

session中的内容:Welcome Session!

request中的内容:

因为PageA.jspPageB.jsp是使用连接,地址栏上的地址也发生了改变,所以是一个从定向跳转,此时request中内容丢失了,所以request中的内容没有显示,如果使用forward跳转,request中的内容将不会丢失。

上面使用了EL表达式来获取各种范围中的数据内容。使用的方式是${applicationScope.msgA},也可以省略Scope部分,直接写成${msgA},省略方式写成${msgA},系统会自动去applicationsessionrequestpage四种范围寻找msgA,所以这种省略的写法只能用在pageScoperequestScopesessionScopeapplicationScope四种范围内。其他不能省略,例如不能把${param.A}省略成${A}

假如applicationScopesessonScope中都有msg呢,用省略的方式${msgA}得到的是什么呢?

[xhtml] view plaincopy

 

28 application.setAttribute("msg", "Welcome Application!");  

29 session.setAttribute("msg", "Welcome Session!");  

 ${msg}将得到的是结果是:Welcome Session!

因为系统自动寻找的步骤是:pageScoperequestScopesessionScopeapplicationScope,所以先找到session中的msg信息。

上面的例子中放入session等范围的都是一些简单的数据,当然也可以放入复制的数据,例如javabean、集合等。

创建Customer.javajavabean

[java] view plaincopy

 

30 package po;  

31 public class Customer {  

32     private String account;  

33     private String password;  

34       

35     public Customer() {  

36           

37     }  

38       

39     public Customer(String account, String password) {  

40         this.account = account;  

41         this.password = password;  

42     }  

43       

44     public String getAccount() {  

45         return account;  

46     }  

47       

48     public void setAccount(String account) {  

49         this.account = account;  

50     }  

51       

52     public String getPassword() {  

53         return password;  

54     }  

55       

56     public void setPassword(String password) {  

57         this.password = password;  

58     }  

59 }  

 在PageA.jsp中生成该javabean

[xhtml] view plaincopy

 

60 Customer cus = new Customer("000", "000");  

61 session.setAttribute("cus", cus);  

 在PageB.jsp中打印该Customer javabean的值,添加如下代码。

[xhtml] view plaincopy

 

62 customer的值为:${cus.account }, ${cus.password }  

 运行结果如下

customer的值为:000, 000

更加复制的情况,在PageA.jsp中加入如下代码

[xhtml] view plaincopy

 

63 ArrayList cuses = new ArrayList();  

64 cuses.add(new Customer("111", "111"));  

65 cuses.add(new Customer("222", "222"));  

66 cuses.add(new Customer("333", "333"));  

67 session.setAttribute("customers", cuses);  

 在PageB.jsp中打印customer信息,添加代码如下

[xhtml] view plaincopy

 

68 所有的customer如下<br/>  

69 第一个:${customers[0].account }, ${customers[0].password }<br/>  

70 第二个:${customers[1].account }, ${customers[1].password }<br/>  

71 第三个:${customers[2].account }, ${customers[2].password }<br/>  

 运行结果如下

第一个:111, 111第二个:222, 222第三个:333, 333

获取param中的值 

 

 

 

使用param,就是使用url传递过来的参数,例如在PageA.jsp中的连接使用如下

[xhtml] view plaincopy

 

72 <a href="PageB.jsp?A=1&B=2" mce_href="PageB.jsp?A=1&B=2">进入PageB页面</a>  

 在PageB.jsp中得到AB的值的代码如下

[xhtml] view plaincopy

 

73 参数A的值是:${param.A }<br/>  

74 参数B的值是:${param.B }<br/>  

 运行结果如下

参数A的值是:1参数B的值是:2

获取cookie中的值

PageA.jsp中添加如下代码

[xhtml] view plaincopy

 

75 response.addCookie(new Cookie("username", "skycloud"));  

 在PageB.jsp中获取cookie的值,代码如下

[xhtml] view plaincopy

 

76 cookie username的值是:${cookie.username.value }  

 运行结果如下

cookie username的值是:skycloud

如果直接使用${cookie.username}将得到一个对象,运行结果如下

cookie username的值是:javax.servlet.http.Cookie@2cc2d4

获取initParam的值

有些时候需要在web.xml中进行一些初始化的工作,例如在web.xml做如下初始化

[xhtml] view plaincopy

 

77 <context-param>  

78     <param-name>encoding</param-name>  

79     <param-value>gb2312</param-value>  

80 </context-param>  

 如果要在PageB.jsp中获取这个初始化参数,在PageB.jsp中添加如下代码

[xhtml] view plaincopy

 

81 初始化参数encoding是:${initParam.encoding }  

 运行结果如下

初始化参数encoding是:gb2312

http://blog.csdn.net/wang_zhou_jian/article/details/5437951

 

3. CKEditor上传图片解决方案

言归正传,对于上传CKEditor已经做好了,我们只要准备个功能,接收CKEditor提交过来的文件就可以了,所以呢实现的思路是:

 

82 准备一下JSP上传文件的JAR包:commons-fileupload.jarcommons-io.jar

83 编写一个JSP用于接收上传的文件(这里除上传图片功能外,需调用一个核心JS语句)

84 编写一个JSP用于浏览文件(这里除上传图片功能外,需调用一个核心JS语句)

85 修改CKEditorconfig.js,将上传文件和浏览文件的JSP配置进去

说明一下,之所以采用JSP没有使用Servlet,那是因为JSP简单啊,这样可以降低CKEditor对项目的侵入性啊。下面看代码啦:

 

用于接收上传的文件的JSP:Java代码  

86 <%@page import="java.io.File"%>   

87 <%@page import="java.util.UUID"%>   

88 <%@page import="org.apache.commons.fileupload.FileItem"%>   

89 <%@page import="java.util.List"%>   

90 <%@page import="org.apache.commons.fileupload.disk.DiskFileItemFactory"%>   

91 <%@page import="org.apache.commons.fileupload.FileItemFactory"%>   

92 <%@page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%>   

93 <%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%>   

94 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">   

95 <html>   

96 <head>   

97 <meta http-equiv="Content-Type" content="text/html; charset=GB18030">   

98 <meta http-equiv="pragma" content="no-cache">   

99 <meta http-equiv="cache-control" content="no-cache">   

100 <meta http-equiv="expires" content="0">   

101 <title>JSP上传文件</title>   

102 </head>   

103 <body>   

104 <%   

105 String path = request.getContextPath() + "/";   

106 if(ServletFileUpload.isMultipartContent(request)){   

107     String type = "";   

108     if(request.getParameter("type") != null)//获取文件分类   

109         type = request.getParameter("type").toLowerCase() + "/";   

110     String callback = request.getParameter("CKEditorFuncNum");//获取回调JS的函数Num   

111     FileItemFactory factory = new DiskFileItemFactory();   

112     ServletFileUpload servletFileUpload = new ServletFileUpload(factory);   

113     servletFileUpload.setHeaderEncoding("UTF-8");//解决文件名乱码的问题   

114     List<FileItem> fileItemsList = servletFileUpload.parseRequest(request);   

115     for (FileItem item : fileItemsList) {   

116         if (!item.isFormField()) {   

117             String fileName = item.getName();   

118             fileName = "file" + System.currentTimeMillis() + fileName.substring(fileName.lastIndexOf("."));   

119             //定义文件路径,根据你的文件夹结构,可能需要做修改   

120             String clientPath = "ckeditor/uploader/upload/" + type + fileName;   

121   

122             //保存文件到服务器上   

123             File file = new File(request.getSession().getServletContext().getRealPath(clientPath));   

124             if (!file.getParentFile().exists()) {   

125                 file.getParentFile().mkdirs();   

126             }   

127             item.write(file);   

128   

129             //打印一段JS,调用parent页面的CKEditor的函数,传递函数编号和上传后文件的路径;这句很重要,成败在此一句   

130             out.println("<script type='text/javascript'>window.parent.CKEDITOR.tools.callFunction("+callback+",'"+path+clientPath+"')</script>");   

131             break;   

132         }   

133     }   

134 }   

135  %>   

136 </body>   

137 </html>  

用于浏览文件的JSP:

Java代码  

138 <%@page import="java.io.File"%>   

139 <%@ page language="java" contentType="text/html; charset=GB18030"  

140     pageEncoding="GB18030"%>   

141 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">   

142 <html>   

143 <head>   

144 <meta http-equiv="Content-Type" content="text/html; charset=GB18030">   

145 <meta http-equiv="pragma" content="no-cache">   

146 <meta http-equiv="cache-control" content="no-cache">   

147 <meta http-equiv="expires" content="0">   

148 <title>图片浏览</title>   

149 <script type="text/javascript">   

150 //这段函数是重点,不然不能和CKEditor互动了   

151 function funCallback(funcNum,fileUrl){   

152     var parentWindow = ( window.parent == window ) ? window.opener : window.parent;   

153     parentWindow.CKEDITOR.tools.callFunction(funcNum, fileUrl);   

154     window.close();   

155 }   

156 </script>   

157 </head>   

158 <body>   

159 <%   

160     String path = request.getContextPath() + "/";   

161     String type = "";   

162     if(request.getParameter("type") != null)//获取文件分类   

163         type = request.getParameter("type").toLowerCase() + "/";   

164     String clientPath = "ckeditor/uploader/upload/" + type;   

165     File root = new File(request.getSession().getServletContext().getRealPath(clientPath));   

166     if(!root.exists()){   

167         root.mkdirs();   

168     }   

169     String callback = request.getParameter("CKEditorFuncNum");   

170     File[] files = root.listFiles();   

171     if(files.length > 0){   

172         for(File file:files ) {   

173             String src = path + clientPath + file.getName();   

174             out.println("<img width='110px' height='70px' src='" + src + "' alt='" + file.getName() + "' onclick="funCallback("+callback+",'"+ src +"')">");   

175         }   

176     }else{   

177         out.println("<h3>未检测到资源。</h3>");   

178     }   

179  %>   

180 </body>   

181 </html>  

修改后的CKEditor的config.js: 

Js代码  

182 CKEDITOR.editorConfig = function( config )   

183 {   

184     config.language = 'zh-cn';   

185     config.filebrowserBrowseUrl = 'ckeditor/uploader/browse.jsp';   

186     config.filebrowserImageBrowseUrl = 'ckeditor/uploader/browse.jsp?type=Images';   

187     config.filebrowserFlashBrowseUrl = 'ckeditor/uploader/browse.jsp?type=Flashs';   

188     config.filebrowserUploadUrl = 'ckeditor/uploader/upload.jsp';   

189     config.filebrowserImageUploadUrl = 'ckeditor/uploader/upload.jsp?type=Images';   

190     config.filebrowserFlashUploadUrl = 'ckeditor/uploader/upload.jsp?type=Flashs';   

191     config.filebrowserWindowWidth = '640';   

192     config.filebrowserWindowHeight = '480';   

193 }  

OK,修改完毕。简单吧,其实上传和浏览文件很简单(上面只是一个演示,代码仅供参考),要点是要调用一下CKEDITOR.tools.callFunction方法。

 

http://blog.sina.com.cn/s/blog_6a0eedb601017q67.html

posted @ 2013-12-18 18:35  apem  阅读(467)  评论(0编辑  收藏  举报