1、路径引用问题
一个css、jsp、html、或者javascript文件从从一个工程复制到另一工程,如果引用的时候使用的时相对路径,看似没有错误,但是却一直引用不进来,这时候要使用绝对路径,这样才能将原来的工程名改成现在的工程;
2.el处理form表单数据问题
我们常用: |
<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 和 response的setCharacterEncoding(“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 : 选中的option的text , 如果被选中的option的value属性有值,那么就是value
4.2 checkbox : 获取方式必须是getParameterValues , 得出是一个数组,装载着所有打勾的checkbox
5.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>
该操作允许将请求转发到另一个JSP,Servlet或者静态资源文件。一旦遇上此标记即会停止执行当前的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>标签使用Bean的setXXX()方法。利用它设置属性多种方法。
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可以是一个类本身,也可以是一个类的父类,或者是一个类的接口。如果没有使用class和BeanName指定type,Bean将不会被 实例化
另外不能同时使用 class和BeanName。BeanName的是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>
解释:
1:type="bean/applet"
2:code="classFileName" 插件执行JAVA类文件的名称。在名称中必须加上扩展名,且此文件必须放在用 codebase属性的目录下。
3:codebase="classFileDirectoryName"这包含插件将运行的JAVA类的目录或指向这个目录的路径。默认为JSP文件的当前路径。
4:name="instanceName" 这是Bean或Applet的实例的名称。使得被同一个JSP文件调用的Bean或Applet之间的通讯成为可能。
5:archive="URIToArchive,……"这是以逗号分隔的路径名列表,是那些用于codebase指定的目录下的类装载器预装载的存档文件所在的路径名。
6:align="botton/top/middle/left/right"图形,对象,Applet的排列方式。
7:height="displayPixels" width="displayPixels" 显示的高宽
8:hspace="leftRightPixels" vspace="topBottomPixels" 左右 上下留下空间大小
9:jreversion="JREVersionNumber | 1.1" 这是Applet或Bean运行时所需的JRE版本
10:nspluginurl="URLToPlugin" 这是Netscape Navigator用户能够使用的JRE下载地址
11:iepluginurl="URLToPlugin" 这是Internet Explorer用户能够使用的JRE下载地址
12:<jsp:params>表示需要向Applet或Bean传送的参数或值
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:PLUGIN在JSP中添加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使用
分类: 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中,经常会打印一些变量的内容,这些变量可以是从某个范围中变量,比如page、request、session、application范围。例,打印str变量,下面三种方法都可以:
<%out.println(str)%>,这样会使JSP页面里面包含JAVA代码;
<%=str%>只能从本地获得,如果要从session里面获取必须是<%=session.getAttribute()%>;
${str}则可以从request、session、application范围中获得。
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)。
获取request、session、application中的值
新建项目ELPro,新建页面PageA.jsp、PageB.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.jsp到PageB.jsp是使用连接,地址栏上的地址也发生了改变,所以是一个从定向跳转,此时request中内容丢失了,所以request中的内容没有显示,如果使用forward跳转,request中的内容将不会丢失。
上面使用了EL表达式来获取各种范围中的数据内容。使用的方式是${applicationScope.msgA},也可以省略Scope部分,直接写成${msgA},省略方式写成${msgA},系统会自动去application、session、request、page四种范围寻找msgA,所以这种省略的写法只能用在pageScope、requestScope、sessionScope、applicationScope四种范围内。其他不能省略,例如不能把${param.A}省略成${A}。
假如applicationScope和sessonScope中都有msg呢,用省略的方式${msgA}得到的是什么呢?
[xhtml] view plaincopy
28 application.setAttribute("msg", "Welcome Application!");
29 session.setAttribute("msg", "Welcome Session!");
${msg}将得到的是结果是:Welcome Session!
因为系统自动寻找的步骤是:pageScope、requestScope、sessionScope、applicationScope,所以先找到session中的msg信息。
上面的例子中放入session等范围的都是一些简单的数据,当然也可以放入复制的数据,例如javabean、集合等。
创建Customer.java的javabean
[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中得到A和B的值的代码如下
[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.jar和commons-io.jar
83 编写一个JSP用于接收上传的文件(这里除上传图片功能外,需调用一个核心JS语句)
84 编写一个JSP用于浏览文件(这里除上传图片功能外,需调用一个核心JS语句)
85 修改CKEditor的config.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() + "' οnclick="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方法。