1. 程式人生 > >Web---自己寫的一個簡單雲相簿~

Web---自己寫的一個簡單雲相簿~

實現的功能是:
使用者可以一次上傳一個至多個檔案。
使用者可以下載其他人上傳的圖片。
使用者可以檢視其他所有人的圖片。
使用者只能刪除通過自己IP上傳的圖片。

用到的技術:
檔案上傳下載、設計模式、Dom4j、xPath等。

先看下2個頁面:

原始碼:

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name> <servlet> <servlet-name>UploadServlet</servlet-name> <servlet-class>cn.hncu.servlets.UploadServlet</servlet-class>
</servlet> <servlet> <servlet-name>cloudPhotoServlet</servlet-name> <servlet-class>cn.hncu.servlets.cloudPhotoServlet</servlet-class> </servlet> <servlet> <servlet-name>DownServlet</servlet-name> <servlet-class>cn.hncu.servlets.DownServlet</servlet-class
>
</servlet> <servlet> <servlet-name>DelServlet</servlet-name> <servlet-class>cn.hncu.servlets.DelServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UploadServlet</servlet-name> <url-pattern>/upload</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>cloudPhotoServlet</servlet-name> <url-pattern>/cloudPhoto</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>DownServlet</servlet-name> <url-pattern>/servlet/DownServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>DelServlet</servlet-name> <url-pattern>/servlet/DelServlet</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>

index.jsp:

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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>chx雲相簿</title>
    <script type="text/javascript">
        function delFile(input){
            table = input.parentElement.parentElement.parentElement;//table.nodeName  TBODY

            table.removeChild(input.parentElement.parentElement);
        }
        var t=1;
        function addFile(input){
            tr = input.parentElement.parentElement;
            //alert(tr.nodeName);
            var str = "<td>選擇檔案:</td>"+
                "<td> <input type='file' name='file"+t+"'> </td> "+
                "<td>檔案說明:</td>"+
                "<td> <input type='text' name='text"+t+"'> </td> "+
                "<td> <input type='button' value='刪除檔案' onclick='delFile(this)'> </td>";
            tr.insertAdjacentHTML("beforeBegin",str);
        }

        function move(){
            window.location.href="/myPhoto/cloudPhoto";
        }
    </script>

    <style type="text/css">
        #font{
            color:red;
        }

    </style>
  </head>

  <body>
    <h1><font id="font">相簿上傳:</font></h1>
    <form action="/myPhoto/upload" method="post" enctype="multipart/form-data">
        <table border="1px" bordercolor="red">
            <tr>
                <td>選擇檔案:</td>
                <td> <input type="file" name="file1"> </td> 
                <td>檔案說明:</td>
                <td> <input type="text" name="text1"> </td> 
                <td> <input type="button" value="刪 除 文 件" onclick="delFile(this)"> </td>
            </tr>
            <tr>
                <td colspan=2> <input type="submit" value="上 傳 文 件"> </td>
                <td colspan=3> <input type="button" value="添 加 文 件" onclick="addFile(this)"> </td>
            </tr>
        </table>
    </form>
    <form action="/myPhoto/cloudPhoto" method="post" enctype="multipart/form-data">
        <table border="1px;double;#ff0000">
            <tr>
                <td colspan=5><input type="submit" value="進 入 雲 相 冊" onclick="move()"></td>
            </tr>
        </table>
    </form>
  </body>
</html>

photo.xml:

<?xml version="1.0" encoding="UTF-8"?>
<photos>

</photos>

MyUtils.java:

package cn.hncu.utils;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

public class MyUtils {

    /**
     * @return 獲取UUID
     */
    public static String getUUID(){
        return UUID.randomUUID().toString().replace("-", "");
    }

    /**
     * @param uuid
     * @return 通過uuid,獲得打散後的路徑
     */
    public static String getDir(String uuid){
        String dir1 = Integer.toHexString( uuid.hashCode() & 0xf );
        String dir2 = Integer.toHexString( (uuid.hashCode() & 0xf0)>>4 );
        return "/"+dir1+"/"+dir2;
    }

    //日期時間格式
    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
    /**
     * @return 返回的是上傳的時候的日期時間
     */
    public static String getCurrentDateTime(){
        return sdf.format(new Date());
    }

}

Dom4jFactory.java:

package cn.hncu.utils;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class Dom4jFactory {
    private static Document dom=null;
    private static String path;
    //靜態塊!只會執行一次!特點是在類載入的時候就執行
    static{
        try {
            SAXReader sax = new SAXReader();
            //因為我們的資源已經從myelipse中釋出到tomcat伺服器中了,所以跟原來的純Java專案不一樣了。
            //利用當前類找到它的類載入器,然後通過該類載入器再去獲得資源路徑
            path = Dom4jFactory.class.getClassLoader().getResource("photo.xml").getPath();
            //getClassLoader()返回:載入此物件所表示的類或介面的類載入器
            //public URL getResource(String name)返回:讀取資源的 URL 物件;如果找不到該資源,或者呼叫者沒有足夠的許可權獲取該資源,則返回 null。
            //此方法首先搜尋資源的父類載入器;如果父類載入器為 null,則搜尋的路徑就是虛擬機器的內建類載入器的路徑。
            //public String getPath()獲取此 URL 的路徑部分。 
            System.out.println(path);
            dom = sax.read(new FileInputStream(path));
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (DocumentException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * @return 獲取相簿的Document
     */
    public static Document getDocument(){
        return dom;
    }

    /**
     * 進行photo.xml的儲存,儲存到本地
     */
    public static boolean save(){
        try {
            XMLWriter w = new XMLWriter(new FileOutputStream(path));
            w.write(dom);
            w.close();
            return true;
        } catch (UnsupportedEncodingException e) {
            return false;
        } catch (FileNotFoundException e) {
            return false;
        } catch (IOException e) {
            return false;
        }
    }

    public static boolean del(String uuid){
        Node node = dom.selectSingleNode("[@uuid='"+uuid+"']");
        if(node==null){
            return false;
        }
        node.getParent().remove(node);
        return true;
    }


    /**
     * 測試用
     * @param args
     */
    public static void main(String[] args){
        System.out.println( getDocument() );
    }
}

PhotoModel.java-值物件

package cn.hncu.domain;
/**
 * 值物件封裝
 * @author 陳浩翔
 * 2016-7-24
 */
public class PhotoModel {

    private String uuid;//uuid
    private String realName="";//圖片真實檔名(上傳時的檔名)
    private String ext;//字尾名
    private String dir;//打散後的路徑
    private String dateTime;//上傳檔案的時間
    private String ip;//上傳者的IP
    private String desc;//檔案的說明
    public String getUuid() {
        return uuid;
    }
    public void setUuid(String uuid) {
        this.uuid = uuid;
    }
    public String getRealName() {
        return realName;
    }
    public void setRealName(String realName) {
        this.realName = realName;
    }
    public String getExt() {
        return ext;
    }
    public void setExt(String ext) {
        this.ext = ext;
    }
    public String getDir() {
        return dir;
    }
    public void setDir(String dir) {
        this.dir = dir;
    }
    public String getDateTime() {
        return dateTime;
    }
    public void setDateTime(String dateTime) {
        this.dateTime = dateTime;
    }
    public String getIp() {
        return ip;
    }
    public void setIp(String ip) {
        this.ip = ip;
    }
    public String getDesc() {
        return desc;
    }
    public void setDesc(String desc) {
        this.desc = desc;
    }
    @Override
    public String toString() {
        return "PhotoModel [uuid=" + uuid + ", realName=" + realName + ", ext="
                + ext + ", dir=" + dir + ", dateTime=" + dateTime + ", ip="
                + ip + ", desc=" + desc + "]";
    }

}

PhotoDao.java:

package cn.hncu.photoDao.Dao;

import java.util.List;

import cn.hncu.domain.PhotoModel;

public interface PhotoDao {
    /**
     * @param photo
     * @return 資料的儲存
     */
    public boolean save(PhotoModel photo);

    /**
     * @return 返回所所有的圖片資訊
     */
    public List<PhotoModel> getAll();

    /**
     * @param uuid
     * @return 通過uuid 查詢那個被封裝的值物件
     */
    public PhotoModel getSingleByUuid(String uuid);


    /**
     * @param uuid
     * @return 通過uuid刪除photos.xml中該圖片的資訊
     */
    public boolean deleteXml(String uuid);

    /**
     * @param dir
     * @return 通過路徑刪除伺服器磁碟中該圖片的資訊
     */
    public boolean deleteFile(String pathFileName);
}

PhotoSerImpl.java:

package cn.hncu.photoDao.impl;

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;

import cn.hncu.domain.PhotoModel;
import cn.hncu.photoDao.Dao.PhotoDao;
import cn.hncu.utils.Dom4jFactory;

public class PhotoSerImpl implements PhotoDao{

    @Override
    public boolean save(PhotoModel photo) {
        Document dom = Dom4jFactory.getDocument();

        Element root = dom.getRootElement();
        //新增屬性
        Element p = root.addElement("photo");
        p.addAttribute("uuid", photo.getUuid());
        p.addAttribute("realName", photo.getRealName());
        p.addAttribute("dateTime", photo.getDateTime());
        p.addAttribute("ip", photo.getIp());
        p.addAttribute("ext", photo.getExt());
        p.addAttribute("dir", photo.getDir());
        p.addAttribute("desc", photo.getDesc());
        return Dom4jFactory.save();
    }

    @Override
    public List<PhotoModel> getAll() {
        List<PhotoModel> list = new ArrayList<PhotoModel>();
        Document dom = Dom4jFactory.getDocument();
        Element root = dom.getRootElement();
        Iterator<Element> it = root.elementIterator("photo");
        //通過DOM4J獲得photo元素的迭代器,也可以通過xPath來找到所有的 photo
        //List<Node> lists = dom.selectNodes("//photo[@uuid]");
        //Iterator<Node> it = lists.iterator();
        while(it.hasNext()){
            Element e = it.next();
            PhotoModel photo = new PhotoModel();
            photo.setUuid(e.attributeValue("uuid"));
            photo.setRealName(e.attributeValue("realName"));
            photo.setDateTime(e.attributeValue("dateTime"));
            photo.setExt(e.attributeValue("ext"));
            photo.setIp(e.attributeValue("ip"));
            photo.setDir(e.attributeValue("dir"));
            photo.setDesc(e.attributeValue("desc"));
            list.add(photo);
        }
        return list;
    }

    @Override
    public PhotoModel getSingleByUuid(String uuid) {
        List<PhotoModel> photos=getAll();
        for(PhotoModel photo:photos){
            if(photo.getUuid().equals(uuid)){
                return photo;
            }
        }
        return null;
    }

    @Override
    public boolean deleteXml(String uuid) {
        Document dom = Dom4jFactory.getDocument();
        Element e = (Element) dom.selectSingleNode("//photo[@uuid='"+uuid.trim()+"']");
        return e.getParent().remove(e);
    }

    @Override
    public boolean deleteFile(String pathFileName) {
        try {
            File file = new File(pathFileName);
            if(file.exists()){
                file.delete();
            }
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}

PhotoDaoFactory.java:

package cn.hncu.photoDao.factory;

import cn.hncu.photoDao.impl.PhotoSerImpl;

/**
 * 工廠方法
 * @author 陳浩翔
 * 2016-7-24
 */
public class PhotoDaoFactory {
    public static PhotoSerImpl getPhotoDao(){
        return new PhotoSerImpl();
    }
}

上傳-UploadServlet.java:

package cn.hncu.servlets;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import cn.hncu.domain.PhotoModel;
import cn.hncu.photoDao.Dao.PhotoDao;
import cn.hncu.photoDao.factory.PhotoDaoFactory;
import cn.hncu.utils.Dom4jFactory;
import cn.hncu.utils.MyUtils;

public class UploadServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().print("<h1>很抱歉,本頁面不支援GET方式訪問!!!</h1>");
        response.getWriter().print("<a href='javascript:history.go(-1)'>返回上一頁</a> ");
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        final PrintWriter out = response.getWriter();

        //防黑-非multipart表單提交
        //使用上傳工具的方式
        boolean boo = ServletFileUpload.isMultipartContent(request);
        if(!boo){
            out.print("<h1>不支援普通表單的提交方式!</h1>");
            return;
        }

        File file = new File("d:/photoCache");
        if(!file.exists()){
            file.mkdir();
        }

        DiskFileItemFactory fiFactory = new DiskFileItemFactory(1024*10,file);

        ServletFileUpload upload = new ServletFileUpload(fiFactory);
        upload.setHeaderEncoding("utf-8");//設定檔名編碼
        String path = getServletContext().getRealPath("/photos");


        FileItem fi = null;
        try {
            List<FileItem> list = upload.parseRequest(request);
            PhotoModel photo = new PhotoModel();//資料封裝---需要7個屬性
            photo.setRealName("");
            int cont=0;
            for(FileItem f:list){
                if(cont!=0 && cont%2==0 && !photo.getRealName().equals("")){
                    photo = new PhotoModel();//重新資料封裝
                }
                fi=f;
                if(fi.isFormField()){//普通表單元件
                    //得到檔案說明
                    String desc = fi.getString("utf-8");
                    photo.setDesc(desc);//#1
                }else{

                    //防黑3-如果在file元件中不選擇檔案
                    if(fi.getSize()==0){
                        photo.setRealName("");
                        cont++;
                        continue;
                    }
                    String fileName = fi.getName();
                    fileName = fileName.substring( fileName.lastIndexOf("\\")+1);//真實檔名
                    photo.setRealName(fileName);//#2
                    String ext = fileName.substring(fileName.lastIndexOf("."));//副檔名
                    photo.setExt(ext);//#3
                    photo.setDateTime(MyUtils.getCurrentDateTime());//#4
                    photo.setIp( request.getRemoteAddr() );//#5
                    String uuid = MyUtils.getUUID();
                    photo.setUuid(uuid);//#6
                    photo.setDir( MyUtils.getDir(uuid) );//#7

                    //打散目錄
                    File dFile = new File(path+photo.getDir());
                    if(!dFile.exists()){
                        dFile.mkdirs();
                    }

                    fi.write(new File(path+photo.getDir()+"/"+photo.getUuid()+photo.getExt()));


                }

                cont++;

                if(cont%2==0 && !photo.getRealName().equals("")){
                    PhotoDao dao = PhotoDaoFactory.getPhotoDao();
                    boo = dao.save(photo);
                    //存入磁碟-法二:FileUtils.copyInputStreamToFile(in, new File(fileName2));//※2※ 把圖片檔案儲存到伺服器硬碟
                    photo = new PhotoModel();//重新資料封裝
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            if(fi!=null){
                fi.delete();
            }
            if(Dom4jFactory.save()){
                out.print("<h1>上傳成功!</h1>");
                out.print("<a href='javascript:history.go(-1)'>返回上一頁</a> ");
            }else{
                out.print("<h1>上傳失敗!</h1>");
                out.print("<a href='javascript:history.go(-1)'>返回上一頁</a> ");
            }
        }
    }
}

顯示所有檔案-cloudPhotoServlet.java

package cn.hncu.servlets;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.hncu.domain.PhotoModel;
import cn.hncu.photoDao.Dao.PhotoDao;
import cn.hncu.photoDao.factory.PhotoDaoFactory;

public class cloudPhotoServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String pwd = (String) request.getParameter("pwd");
        if ("chx".equals(pwd)) {
            doPost(request, response);
        } else {
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().print("<h1>很抱歉,你沒有許可權訪問!!!</h1>");
        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
        out.println("<HTML>");
        out.println("  <HEAD><TITLE>CHX雲相簿</TITLE></HEAD>");
        out.println("  <BODY>");

        out.println("<table border='1px' bordercolor='red'>");
        out.println("<tr>");
        out.println("<td>檔名</td>");
        out.println("<td>上傳時間");
        out.println("<td>檔案</td>");
        out.println("<td>檔案說明</td>");
        out.println("<td>操作</td> ");
        out.println("</tr>");

        String tdWH = "style='width:200px; height:200px;'";

        // 顯示所有圖片
        PhotoDao dao = PhotoDaoFactory.getPhotoDao();
        List<PhotoModel> photos = dao.getAll();
        for (PhotoModel photo : photos) {
            String fileName = photo.getRealName();
            String time = photo.getDateTime();

            // 輸出圖片
            String path = request.getContextPath() + "/photos/"
                    + photo.getDir() + "/" + photo.getUuid() + photo.getExt();
            // System.out.println(path);
            // /myPhoto/photos//7/c/a1237a48a6aa451cb22fa78b15bafcea.jpg
            String img = "<a href='" + path + "'><img src='" + path + "'/></a>";
            String desc = photo.getDesc();

            String delStr = "<a href='/myPhoto/servlet/DelServlet?uuid="
                    + photo.getUuid() + "'>刪除</a>";
            String downStr = "<a href='/myPhoto/servlet/DownServlet?uuid="
                    + photo.getUuid() + "'>下載</a>";

            out.println("<tr>");
            out.println("<td " + tdWH + "> " + fileName + " </td>");
            out.println("<td " + tdWH + ">" + time + "</td>");
            out.println("<td " + tdWH + ">" + img + "</td>");
            out.println("<td " + tdWH + ">" + desc + "</td>");
            out.println("<td " + tdWH + ">" + delStr + "&nbsp;" + downStr
                    + "</td>");
            out.println("</tr>");
        }

        out.println("<tr>");
        out.println("</tr>");

        out.println("</table>");

        out.println("  </BODY>");
        out.println("</HTML>");
        out.flush();
        out.close();
    }

}

刪除檔案-DelServlet.java

package cn.hncu.servlets;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http
            
           

相關推薦

Web---自己一個簡單相簿~

實現的功能是: 使用者可以一次上傳一個至多個檔案。 使用者可以下載其他人上傳的圖片。 使用者可以檢視其他所有人的圖片。 使用者只能刪除通過自己IP上傳的圖片。 用到的技術: 檔案上傳下載、設計模式、Dom4j、xPath等。 先看下2個頁面:

自己一個簡單Web伺服器(附Demo)

一、什麼是Web伺服器? 先來寫個例子親身體驗一下。下面的示例程式碼演示瞭如何通過 java.net.Socket 與 java.net.ServerSocket這兩個重要的類建立一個簡單基於 Java 的 Web 伺服器 。這個伺服器通過8784

自己一個簡單的Spring IOC容器

為了能更好的理解SpirngIOC是如何工作的,在查閱網上的資料後,自己寫了一個非常簡單的SpringIOC容器,使用setter方法將值注入。 本例子需要用到jdom的包:http://pan.baidu.com/s/1hsmgsfi 以下是包結構 A和B介面的定義就不

自己一個簡單的ArrayList

自己通過寫一個簡單的SimpleArrayList來加深對JDK原始碼中的ArrayList的理解。 構造器 如果沒有對集合設定長度,這裡我們預設採取長度為10作為內建陣列的初始化長度。 public SimpleArrayList() {

ROS的初步學習(五)--自己一個簡單的釋出(Publisher)、訂閱(Subscriber)程式

1 寫一個釋出(Publisher)節點 節點(node)是連線到ROS網路中可執行的基本單元。我們在這建立一個釋出者—“talker”節點,這個節點持續對外發布訊息。 首先我們要把目錄切換到我們的beginner_tutorials工程包中 $ cd ~

怎樣自己一個簡單的作業系統

       如非業務需要必要,不建議自己實現完整的計算機作業系統。重造車輪的累贅先不說。        在自己造的過程中,彷彿體驗了事無鉅細一切都要自己實現的艱辛,和訪問底層硬體處理dirty work帶來的虛假的智力/經驗上升的快感和空洞的談資的積累。 這不一定帶來良好

使用 js,自己一個簡單的滾動條

back http 之前 fun 完全 light get ini 計算 當我們給元素加上 overflow: auto; 的時候,就會出現滾動條,然而瀏覽的不同,滾動條的樣式大不一樣,有些甚至非常醜。 於是就想著自己寫一個滾動條,大概需要弄清楚一下這幾個點: 1、滾

自己一個C#數據結構:用List<T>實現一個簡單的Stack

count 實現簡單 ole exceptio tac on() rem linq -- 在C#中利用List<T>實現一個簡單的Stack 需要實現的功能:壓棧、彈棧、查看棧頂元素、查看元素個數、查看Socket是否為空,判斷元素是否在Socket中、清空So

自己動手一個簡單的MVC框架(第一版)

一、MVC概念回顧   路由(Route)、控制器(Controller)、行為(Action)、模型(Model)、檢視(View) 用一句簡單地話來描述以上關鍵點:   路由(Route)就相當於一個公司的前臺小姐,她負責帶你(請求)找到跟你面試的面試官(控制器Controller),面試官

自己動手一個簡單的MVC框架(第二版)

一、ASP.NET MVC核心機制回顧   在ASP.NET MVC中,最核心的當屬“路由系統”,而路由系統的核心則源於一個強大的System.Web.Routing.dll元件。   在這個System.Web.Routing.dll中,有一個最重要的類叫做UrlRoutingModule,它是一個

自己手動一個簡單的bs結構

拋去web框架,自己手寫一個BS請求響應過程: 自己建立一個資料夾test,包含一個hello.html 和一個webserver.py 自己在html檔案裡面寫一些標籤 下面是webserver.py的主要內容: import os from

linux設備驅動第三篇:一個簡單的字符設備驅動

提示 copy flags 驅動程序 相關 clas open ugo param 在linux設備驅動第一篇:設備驅動程序簡介中簡單介紹了字符驅動,本篇簡單介紹如何寫一個簡單的字符設備驅動。本篇借鑒LDD中的源碼,實現一個與硬件設備無關的字符設備驅動,僅僅操

自己一個文字過長顯示省略號的函數

bsp aaa poi var cti 顯示 adf 函數 字符 function points(strin,num){ //strin表示目標字符,num表示在第幾個字符用省略號顯示   var Str = "",len = strin.length;   if(len

采用jsp頁面與java代碼分離的方式一個簡單的二維表

color arraylist 一個 3-9 業務 動態顯示 復雜 分層架構 方式 前提:在我們做程序時追求的是高內聚,低耦合,但是如果我們把jsp頁面的的代碼和java的代碼都放在了jsp的代碼編寫中,使java和jsp高耦合這樣的話不僅使jsp代碼頁面顯得很復雜,而

一個簡單的導航

utf-8 mar title shee 小圖標 list .cn display left 制作一個如下圖的導航按鈕。當鼠標移入導航欄的首頁,商店等字體時,前面的小圖標和字顏色一起變紅!代碼如下: <meta charset="UTF-8"> <

oracle 10G 沒有 PIVOT 函數怎麽辦,自己一個不久有了

name 行轉列 動態sql self. subst ger esc 10g 必須 眾所周知,靜態SQL的輸出結構必須也是靜態的。對於經典的行轉列問題,如果行數不定導致輸出的列數不定,標準的答案就是使用動態SQL, 到11G裏面則有XML結果的PIVOT。 但是 orac

python一個簡單的接口

結果 服務 web框架 簡單的 bsp 16px 這樣的 flask span 寫一個接口: 1、用到的模塊是flask,flask是一個python的一個web框架,可以用來開發接口和web頁面 2、 啟動服務的效果是這樣的: 用postman測試的結

一個簡單的JQ插件(例子)

ont ava 兼容 app js代碼 lsp 是把 生成 order 雖然現在 vue angular react 當道啊但是那 JQ還是有一席之地很多很多的小單位啊.其實還會用到我也放一個例子吧雖然我也不是很肯定有沒有人寫的比我更好啊但是我相信 我這個還是蠻實用的 話不

用集合一個簡單的隨機分組,以及集合內元素數量查詢

移除 以及 表示 元素 move spa color 查詢 println 12個人,隨機分為4組 public static void main(String[] args) { List list = new ArrayList();

一個簡單的struts2

return 簡單的 index taglib struts2 text apach prepare mil 導包:struts2-core-2.5.1 寫action類, package web; public class HelloWorldAction {