• 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

  • 相关阅读:
    朴素贝叶斯分类算法原理
    DevExpress控件学习总结
    Nginx + Tomcat 配置负载均衡集群
    DotNet Core全新认识
    为何梯度反方向是函数值下降最快的方向
    理解矩阵
    C#版-Redis缓存服务器在Windows下的使用
    文本情感分类:分词 OR 不分词(3)
    文本情感分类:深度学习模型(2)
    文本情感分类:传统模型(1)
  • 原文地址:https://www.cnblogs.com/apem/p/3480867.html
Copyright © 2020-2023  润新知