<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    servlet-mapping元素及其子元素

    <servlet-mapping>元素在Servlet和URL樣式之間定義一個映射。它包含了兩個子元素<servlet- name>和<url-pattern>,<servlet-name>元素給出的Servlet名字必須是在<servlet>元素中聲明過的Servlet的名字。<url-pattern>元素指定對應于Servlet的URL路徑,該路徑是相對于Web應用程序上下文根的路徑。例如:

    <servlet-mapping>
    <servlet-name>helloworld</servlet-name>
    <url-pattern>/hello</url-pattern>
    </servlet-mapping>

     

            Servlet 2.5規范允許<servlet-mapping>的<url-pattern>子元素出現多次,之前的規范只允許一個<servlet-mapping>元素包含一個<url-pattern>子元素。我們看下面的例子:
    <servlet-mapping>
    <servlet-name>welcome</servlet-name>
    <url-pattern>/en/welcome</url-pattern>
    <url-pattern>/zh/welcome</url-pattern>
    </servlet-mapping>

           在配置了Servlet與URL樣式之間的映射后,當Servlet容器接收到一個請求,它首先確定該請求應該由哪一個Web應用程序來響應。這是通過比較請求URI的開始部分與Web應用程序的上下文路徑來確定的。映射到Servlet的路徑是請求URI減去上下文的路徑,Web應用程序的Context對象在去掉請求URI的上下文路徑后,將按照下面的路徑映射規則的順序對剩余部分的路徑進行處理,并且在找到第一個成功的匹配后,不再進行下一個匹配。

          容器試著對請求的路徑和Servlet映射的路徑進行精確匹配,如果匹配成功,則調用這個Servlet來處理請求。

          容器試著匹配最長的路徑前綴,以斜杠(/)為路徑分隔符,按照路徑樹逐級遞減匹配,選擇最長匹配的Servlet來處理請求。

          如果請求的URL路徑最后有擴展名,如.jsp,Servlet容器會試著匹配處理這個擴展名的Servlet。

           如果按照前面3條規則沒有找到匹配的Servlet,容器會調用Web應用程序默認的Servlet來對請求進行處理,如果沒有定義默認的Servlet,容器將向客戶端發送HTTP 404錯誤信息(請求資源不存在)。

           在部署描述符中,可以使用下面的語法來定義映射。

          以/開始并且以 /* 結束的字符串用來映射路徑,例如:

    <url-pattern>/admin/*</url-pattern>

            如果沒有精確匹配,那么對/admin/路徑下的資源的所有請求將由映射了上述URL樣式的Servlet來處理。

            以 *. 為前綴的字符串用來映射擴展名,例如:

    <url-pattern>*.do</url-pattern>

        如果沒有精確匹配和路徑匹配,那么對具有.do擴展名的資源的請求將由映射了上述URL樣式的Servlet來處理。

             以一個單獨的/指示這個Web應用程序是默認的Servlet,例如:

    <url-pattern>/</url-pattern>

            如果對某個請求沒有找到匹配的Servlet,那么將使用Web應用程序的默認Servlet來處理。

             所有其他的字符被用于精確匹配,例如:

    <url-pattern>/login</url-pattern>

              如果請求/login,那么將由映射了URL樣式/login的Servlet來處理。

    posted @ 2012-05-22 20:32 youngturk 閱讀(18508) | 評論 (1)編輯 收藏

    web.xml中servlet控制參數方法

    web.xml中servlet:

        <servlet>   <!--接著順序加載servlet被初始化-->
               
    <!-- servlet獲得控制文件Class的名字,類名 -->
            
    <servlet-name>smvcCoreDispatcher</servlet-name>
            
    <servlet-class>org.bluechant.mvc.core.CoreDispatcherController</servlet-class>
            
    <init-param>
                
    <param-name>templateLoaderPath</param-name>
                
    <param-value>/WEB-INF/view</param-value>
            
    </init-param>
            
    <init-param>
                
    <param-name>defaultEncoding</param-name>
                
    <param-value>GBK</param-value>
            
    </init-param>
            
    <init-param>
                
    <param-name>contextConfigLocation</param-name>
                
    <param-value>/WEB-INF/smvc_config/smvc-config.xml</param-value>
            
    </init-param>
            
    <load-on-startup>1</load-on-startup><!-- 加載路徑 -->
        
         
    </servlet>
        
    <servlet-mapping>
            
    <servlet-name>smvcCoreDispatcher</servlet-name>
            
    <url-pattern>*.do</url-pattern>
        
    </servlet-mapping>
        
        
    <welcome-file-list>
            
    <welcome-file>login.html</welcome-file>
        
    </welcome-file-list>

    web.xml對應的servlet控制java改寫:

    package org.bluechant.mvc.core;

    import java.io.IOException;
    import java.io.PrintWriter;
    import java.io.UnsupportedEncodingException;
    import java.lang.reflect.Method;
    import java.util.Enumeration;
    import java.util.Locale;
    import java.util.Map;

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

    import org.apache.log4j.Logger;
    import org.bluechant.mvc.controller.ModelAndView;
    import org.bluechant.mvc.core.util.ServletUtils;

    import freemarker.template.Configuration;
    import freemarker.template.ObjectWrapper;
    import freemarker.template.Template;
    import freemarker.template.TemplateException;
    import freemarker.template.TemplateExceptionHandler;

    public class CoreDispatcherController extends HttpServlet {
        
        private Logger logger = Logger.getLogger(CoreDispatcherController.class);
        
        private CacheManager cache ;
        
        private String baseControllerClass = "org.bluechant.mvc.controller.Controller";

        private static final long serialVersionUID = 1L;
        
        private Configuration cfg ;
        
        private String templateLoaderPath ;
        
        private String defaultEncoding ;    
        
        private String contentType ;

        private String contextConfigLocation ;
        
        private ActionConfig actionCoinfig ;    
        
        public void init(ServletConfig config) throws ServletException {
            
            super.init(config);
            //super.init(config);

            String absPath = config.getServletContext().getRealPath("/");//獲得系統絕對路徑
            System.out.println("absPath:"+absPath);
            //getRealPath("/virtual_dir/file2.txt")應該返回"C:\site\a_virtual\file2.txt"   getRealPath("/file3.txt")應該返回null,因為這個文件不存在。 
            ///返回路徑D:\Java\workspaces\helios\newshpt\獲得文件路徑
            defaultEncoding = getInitParameter("defaultEncoding");
            
            templateLoaderPath = getInitParameter("templateLoaderPath");
            //");//從web.xml中獲得templateLoaderPath信息,web.xml中對應的路徑”/WEB-INF/view“
            
            contextConfigLocation = getInitParameter("contextConfigLocation");
            System.out.println("contextConfigLocation:"+contextConfigLocation);
            ///獲得web.xml文件中路徑WEB-INF/smvc_config/smvc-config.xml
            actionCoinfig = new ActionConfig();
            actionCoinfig.load(absPath+contextConfigLocation);//文檔進行解析與讀取,
            ///D:\Java\workspaces\helios\newshpt\WEB-INF/smvc_config/smvc-config.xml
            contentType = "text/html;charset="+defaultEncoding ;
            
            //創建Configuration實例,Configuration是入口,通過它來獲得配置文件
            cfg = new Configuration();
            //設置模板路徑, getServletContext(),所有是所有路徑都能拿到的..
            cfg.setServletContextForTemplateLoading(getServletContext(), templateLoaderPath);
            //cfg.setServletContextForTemplateLoading(arg0, arg1)
            //設置編碼格式
            cfg.setEncoding(Locale.getDefault(), defaultEncoding);
            
            //init cache manager
            cache = CacheManager.getInstance();
        }
        
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            processRequest(request,response);
        }
        
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {    
            processRequest(request,response);
            
        }
        
        private void showRequestParams(HttpServletRequest request){
            Enumeration en = request.getParameterNames();
            while (en.hasMoreElements()) {
                String paramName = (String) en.nextElement();
                String[] paramValues = request.getParameterValues(paramName);
                if (paramValues.length == 1) {
                    String paramValue = paramValues[0];
                    if (paramValue.length() != 0) {
                        //map.put(paramName, paramValue);
                        //System.out.println(paramName+"\t"+paramValue);
                    }
                }else if(paramValues.length >1 ){//checkbox
                    //map.put(paramName, paramValues);
                    //System.out.println(paramName+"\t"+paramValues);
                }
            }
        }
        
        public void processRequest(HttpServletRequest request, HttpServletResponse response){
            
            try {
                request.setCharacterEncoding(defaultEncoding);
                showRequestParams(request);//waiting back to resolve
            } catch (UnsupportedEncodingException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } // set request encoding
            
            ModelAndView mv = analyzeRequest(request);        
            try {
                invokeActionHandler(mv,request);
                if(mv.getViewPath().endsWith(".ftl")){
                    invokeViewResolverHandler(mv , response , request);
                }else{
                    response.sendRedirect(mv.getWebroot()+mv.getViewPath());
                }    
            } catch (Exception e) {
                e.printStackTrace();
            }    
        }
        
        public ModelAndView analyzeRequest(HttpServletRequest request){        
            ModelAndView modelAndView = new ModelAndView();            
            logger.debug("request url path is : "+request.getRequestURI());
            String requestPath = request.getRequestURI(); // /newshpt/account!login.do
            String webroot = request.getContextPath() ; // /newshpt
            System.out.println("request url path is : "+requestPath);
            System.out.println("request webroot path is : "+webroot);
            modelAndView.setWebroot(webroot);
            String actionFullName = requestPath.substring(webroot.length()); // /account!login.do
            System.out.println("actionFullName : "+actionFullName);
            String[] temp = actionFullName.split("!");
            String method = "execute";
            if(temp.length==2){
                 method = temp[1].split("\\.")[0];
            }
            System.out.println("method : "+method);
            String actionName = temp[0]; // /demo
            System.out.println("actionName : "+actionName);
            String className = actionCoinfig.getClassName(actionName);
            System.out.println("className :"+className);
            modelAndView.setClassName(className);
            modelAndView.setMethodName(method);
            modelAndView.setAction(actionName);
            
            return modelAndView ;
        }
        
        /**
         * invoke the request controller's target method 
         * param ModelAndView will be mofified during the process
         * @param mv
         * @param request
         * @throws Exception 
         */
        public void invokeActionHandler(ModelAndView mv , HttpServletRequest request) throws Exception{
            String className = mv.getClassName();
            String methodName = mv.getMethodName();
            //load class
            Class controllerClass = cache.loadClass(className);
            Class parentControllerClass = cache.loadClass(baseControllerClass);
            //load method
            Method setRequest = cache.loadMethod(parentControllerClass, "setRequest", new Class[] { HttpServletRequest.class });    
            Method setModelAndView = cache.loadMethod(parentControllerClass, "setModelAndView", new Class[] { ModelAndView.class });//org.bluechant.mvc.controller.Controller-setModelAndView@6024418  public void org.bluechant.mvc.controller.Controller.setModelAndView(org.bluechant.mvc.controller.ModelAndView)
            Method targetMethod = cache.loadMethod(controllerClass, methodName, new Class[]{});
            //buiid controller instance and invoke target method
            Object instance = controllerClass.newInstance();
            setRequest.invoke(instance, new Object[] { request });//對帶有指定參數的指定對象調用由此 Method 對象表示的基礎方法    
            setModelAndView.invoke(instance, new Object[] { mv });
            targetMethod.invoke(instance, new Object[]{});        
        }
        
        /**
         * send data to view model , and generate the view page by FreeMarker
         */
        public void invokeViewResolverHandler(ModelAndView modelAndView , HttpServletResponse response ,HttpServletRequest request){    
            //convert session attributes to sessionModel , and push to modelAndView
            Map sessionModel = ServletUtils.sessionAttributesToMap(request.getSession());// userSources=[/admin, /button/custom, /custom, /delivery, /loadShip, /unloadPickUp, /unloadShip]
            modelAndView.put("Session", sessionModel);
            response.setContentType(contentType); 
            try {//初始化FreeMarker
                PrintWriter out = response.getWriter();
                Template template = cfg.getTemplate(modelAndView.getViewPath());//取得生成模版文件
                template.setTemplateExceptionHandler(TemplateExceptionHandler.DEBUG_HANDLER);//setTemplateExceptionHandler
                //set the object wrapper , beanwrapper is the perfect useful objectWrapper instance
                template.setObjectWrapper(ObjectWrapper.BEANS_WRAPPER);// 設置對象包裝器
                template.process(modelAndView, out);//模版環境開始載入..
                out.flush();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (TemplateException e) {
                e.printStackTrace();
            }
        }
        
    }


    smvc-config.xml文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <smvc-config>    
        
    <action name="/account" class="com.cenin.tjport.shpt.mvc.controller.AccountController"/>
        
    <action name="/yard" class="com.cenin.tjport.shpt.mvc.controller.DuiCunController"/>
    </smvc-config>



     

    posted @ 2012-05-22 15:08 youngturk 閱讀(1010) | 評論 (0)編輯 收藏

    Method類

    Method 提供關于類或接口上單獨某個方法(以及如何訪問該方法)的信息。所反映的方法可能是類方法或實例方法(包括抽象方法)。

    posted @ 2012-05-22 14:01 youngturk 閱讀(127) | 評論 (0)編輯 收藏

    class類使用說明

    Class類就是你new出來的那個對象的模版 你這么想就ok了 Class會記錄你new的那個對象的元數據,包括 方法信息 屬性信息 實現的接口信息等等等等 虛擬機裝載的就是這個Class對象 而你new的東西就是實際對象屬性值的集合 看看inside jvm這書很有幫助

    難得lz能這么好學 這樣的人不多了 加油吧

    posted @ 2012-05-22 13:42 youngturk 閱讀(144) | 評論 (0)編輯 收藏

    getServletContext(),獲得servlet上下文

    javax.servlet.ServletContext接口

    一個servlet上下文是servlet引擎提供用來服務于Web應用的接口。Servlet上下文具有名字(它屬于Web應用的名字)唯一映射到文件系統的一個目錄。
    一個servlet可以通過ServletConfig對象的getServletContext()方法得到servlet上下文的引用,如果servlet直接或間接調用子類GenericServlet,則可以使用getServletContext()方法。
    Web應用中servlet可以使用servlet上下文得到:
    1.在調用期間保存和檢索屬性的功能,并與其他servlet共享這些屬性。
    2.讀取Web應用中文件內容和其他靜態資源的功能。
    3.互相發送請求的方式。
    4.記錄錯誤和信息化消息的功能。

     
    ServletContext接口中的方法       
    Object getAttribute(String name)    返回servlet上下文中具有指定名字的對象,或使用已指定名捆綁一個對象。從Web應用的標準觀點看,這樣的對象是全局對象,因為它們可以被同一servlet在另一時刻訪問。或上下文中任意其他servlet訪問。       
    void setAttribute(String name,Object obj)    設置servlet上下文中具有指定名字的對象。       
    Enumeration getAttributeNames()    返回保存在servlet上下文中所有屬性名字的枚舉。       
    ServletContext getContext(String uripath)    返回映射到另一URLservlet上下文。在同一服務器中URL必須是以/開頭的絕對路徑。       
    String getInitParameter(String name)    返回指定上下文范圍的初始化參數值。此方法與ServletConfig方法名稱不一樣,后者只應用于已編碼的指定servlet。此方法應用于上下文中所有的參數。       
    Enumeration getInitParameterNames()    返回(可能為空)指定上下文范圍的初始化參數值名字的枚舉值。       
    int getMajorVersion()    返回此上下文中支持servlet API級別的最大和最小版本號。       
    int getMinorVersion()           
    String getMimeType(String fileName)    返回指定文件名的MIME類型。典型情況是基于文件擴展名,而不是文件本身的內容(它可以不必存在)。如果MIME類型未知,可以返回null。       
    RequestDispatcher getNameDispatcher(String name)    返回具有指定名字或路徑的servletJSPRequestDispatcher。如果不能創建RequestDispatch,返回null。如果指定路徑,必須心/開頭,并且是相對于servlet上下文的頂部。       
    RequestDispatcher getNameDispatcher(String path)           
    String getRealPath(String path)    給定一個URI,返回文件系統中URI對應的絕對路徑。如果不能進行映射,返回null。       
    URL getResource(String path)    返回相對于servlet上下文或讀取URL的輸入流的指定絕對路徑相對應的URL,如果資源不存在則返回null。       
    InputStream getResourceAsStream(String path)           
    String getServerInfo()    返順servlet引擎的名稱和版本號。       
    void log(String message)
    void log(String message,Throwable t)    將一個消息寫入servlet注冊,如果給出Throwable參數,則包含棧軌跡。       
    void removeAttribute(String name)    servlet上下文中刪除指定屬性。 

     

    getServletContext()getServletConfig()的意思

    getServletConfig() servlet初始化時,容器傳遞進來一個ServletConfig對象并保存在servlet實例中,該對象允許訪問兩項內容:初始化參數和ServletContext對象,前者通常由容器在文件中指定,允許在運行時向sevrlet傳遞有關調度信息,比如說getServletConfig().getInitParameter("debug")后者為servlet提供有關容器的信息。

    getServletContext()getServletConfig()的意思

    getServletContext()getServletConfig()的意思2007-07-09 11:10.getServletContext() 一個servlet可以使用getServletContext()方法得到web應用的servletContext 即而使用getServletContext的一些方法來獲得一些值 比如說getServletContext().getRealPath("/")來獲得系統絕對路徑 getServletContext().getResource("WEB-INF/config.xml")來獲得xml文件的內容。

    posted @ 2012-05-22 11:21 youngturk 閱讀(3170) | 評論 (0)編輯 收藏

    dom4j學習轉

    1.加載XML文檔
    SAXReader reader = new SAXReader();
    Document doc = reader.read("src/book.xml");

    2.獲得根元素
    Node root = doc.getRootElement();
         或 Element r = doc.getRootElement();

    3.取得某節點的單個子節點
    Element root = root.getRootElement();
    Element memberElm=root.element("member");// "member"是節點名

    4.取得節點的文字
    String text=memberElm.getText();

    5.取得某節點下名為"book"的所有字節點并進行遍歷
    Element r = doc.getRootElement();
    List titles = r.elements("book");
    for(int i=0;i<titles.size();i++){
         System.out.println(((Element)titles.get(i)).asXML());
    }
    6.在某節點下添加子節點.
    Element ageElm = newMemberElm.addElement("age");

    7.設置節點文字.
    ageElm.setText("29");

    8.刪除某節點.
    parentElm.remove(childElm);// childElm是待刪除的節點,parentElm是其父節點

    三.屬性相關.
    1.取得某節點下的某屬性
                Element root=document.getRootElement();   
                Attribute attribute=root.attribute("size");// 屬性名name
    2.取得屬性的文字
                String text=attribute.getText();
    也可以用:
    String text2=root.element("name").attributeValue("firstname");這個是取得根節點下name字節點的屬性firstname的值.

    3.遍歷某節點的所有屬性
                Element root=document.getRootElement();   
                for(Iterator it=root.attributeIterator();it.hasNext();){
                    Attribute attribute = (Attribute) it.next();
                    String text=attribute.getText();
                    System.out.println(text);
                }
    4.設置某節點的屬性和文字.
    newMemberElm.addAttribute("name", "sitinspring");
    5.設置屬性的文字
                Attribute attribute=root.attribute("name");
                attribute.setText("sitinspring");
    6.刪除某屬性
                Attribute attribute=root.attribute("size");// 屬性名name
                root.remove(attribute);
    四.將文檔寫入XML文件.
    1.文檔中全為英文,不設置編碼,直接寫入的形式.
    XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));
    writer.write(document);
    writer.close();
    2.文檔中含有中文,設置編碼格式寫入的形式.
                OutputFormat format = OutputFormat.createPrettyPrint();
                format.setEncoding("GBK");    // 指定XML編碼       
                XMLWriter writer = new XMLWriter(new FileWriter("output.xml"),format);
               
                writer.write(document);
                writer.close();
    五.字符串與XML的轉換
    1.將字符串轉化為XML
    String text = "<members> <member>sitinspring</member> </members>";
    Document document = DocumentHelper.parseText(text);
    2.將文檔或節點的XML轉化為字符串.
                SAXReader reader = new SAXReader();
                Document document = reader.read(new File("input.xml"));           
                Element root=document.getRootElement();               
                String docXmlText=document.asXML();
                String rootXmlText=root.asXML();
                Element memberElm=root.element("member");
                String memberXmlText=memberElm.asXML();
    六.使用XPath快速找到節點.
    讀取的XML文檔示例
    <?xml version="1.0" encoding="UTF-8"?>
    <projectDescription>
    <name>MemberManagement</name>
    <comment></comment>
    <projects>
        <project>PRJ1</project>
        <project>PRJ2</project>
        <project>PRJ3</project>
        <project>PRJ4</project>
    </projects>
    <buildSpec>
        <buildCommand>
          <name>org.eclipse.jdt.core.javabuilder</name>
          <arguments>
          </arguments>
        </buildCommand>
    </buildSpec>
    <natures>
        <nature>org.eclipse.jdt.core.javanature</nature>
    </natures>
    </projectDescription>

    使用XPath快速找到節點project.
    public static void main(String[] args){
        SAXReader reader = new SAXReader();
       
        try{
          Document doc = reader.read(new File("sample.xml"));
         
          List projects=doc.selectNodes("/projectDescription/projects/project");
         
          Iterator it=projects.iterator();
         
          while(it.hasNext()){
            Element elm=(Element)it.next();      
            System.out.println(elm.getText());
          }
         
        }
        catch(Exception ex){
           ex.printStackTrace();
        }
    }


    posted @ 2012-05-22 10:52 youngturk 閱讀(170) | 評論 (0)編輯 收藏

    json格式學習筆記

    1. 什么是 JSON

          JSON概念很簡單,JSON 是一種輕量級的數據格式,他基于 javascript 語法的子集,即數組和對象表示。由于使用的是 javascript 語法,因此JSON 定義可以包含在javascript 文件中,對其的訪問無需通過基于 XML 的語言來額外解析。不過在使用 JSON 之前,很重要的一點是理解 javascript 中數組及對象字面量的特殊語法。

    1.1 數組字面量

             數組字面量,是用一對方括號括起一組用逗號隔開的 javascript 值,例如:

            var aNames=["hello", 12, true , null];

    1.2 對象字面量

            對象字面量,是通過兩個花括號來定義的。在花括號內可以放置任意數量的“名稱-值”對,定義格 式字符串值”。除了最后一行外,每個“名稱-值”對后必須有一個逗號(這與Perl 中的聯合數組的定義有些類似)。例如:

            var oCar = {

                   "color": "red",       

                  "doors" : 4,

                   "paidFor" : true

            };

    1.3 混合字面量

          我們可以混用對象和數組字面量,來創建一個對象數組,或一個包含數組的對象。例如:

    {comments:[
    {
    id:1,
    author:"someone1",
    url:"http://someone1.x2design.net",
    content:"hello"
    },
    {
    id:2,
    author:"someone2",
    url:"http://someone2.x2design.net",
    content:"hello"
    },
    {
    id:3,
    author:"someone3",
    url:"http://someone3.x2design.net",
    content:"hello"
    }
    ]};

    1.4 JSON 語法

          在Ajax應用中,就是服務器直接生成javascript語句,客戶端獲取后直接用eval方法來獲得這個對象,這樣就可以省去解析XML的性能損失。 同時,在javascript 通信中使用JSON作為數據格式的好處很明星,可以立即獲得數據的值,因此可以更快的訪問其中包含的數據。

          var oCarInfo = eval("(" + sJSON + ")");

    請記住:在javascript中花括號也是一個語句。要讓解析器知道這個花括號表示的是一個對象而非一個語句的唯一方法是能否找到封裝它的圓括號(它是用來說明代碼是一個表達式而非一個語句)。

    1.5 JSON 編碼和解碼

           作為 JSON 資源的一部分,Corockford 開發了一個能夠實現 JSON 和Javascript 對象直接解碼和編碼的工具。這個工具的源程序可以在 www.crockford.com/JSON/json.js 中下載。

           在上面提出用到eval() 存在些固有的不足:它是用來對傳入的任何 Javascript 代碼求值的,而不僅僅針對JSON。因此,當涉及企業級 web 應用程序開發時,它存在很大的安全隱患。為了解決這個問題,可以使用只用來將 JSON 代碼轉換為 Javascript 的解析器 JSON.parse() 方法來實現。例如:

           var oObject = JSON.parse (sJSON);

           同時,它也提供了一種將 Javascript 對象轉換為 JSON 字符串(數據傳輸時使用的)的工具(在Javascript 中沒有內建這種功能支持)。你要做的只是將對象傳入到 JSON.Stringify() 方法。請看下面的例子:

           var oCar = new Object();

           oCar.doors = 4;

            oCar.color = "blue";

           oCar.year = 1995;

           oCar.drivers = new Array("Penny", "Dan" , "Kris");

           document.write(JSON.stringify(oCar));

    這段代碼將輸出如下所示的JSON 字符串:

    {"doors" : 4, "color" : "blue", "year" :1995, "drivers" : ["Penny", "Dan" , "Kris"]}

    2. JSON 與 XML

           正如上面所說,JSON 與 XML 相比的一大優點就是它更加簡單。

    請看 XML 數據表示實例:

    使用XML表示:

    <comments>
    <comment>
    <id>1</id>
    <author>someone1</author>
    <url>http://someone1.x2design.net</url>
    <content>hello</content>
    </comment>
    <comment>
    <id>2</id>
    <author>someone2</author>
    <url>http://someone2.x2design.net</url>
    <content>someone1</content>
    </comment>
    <comment>
    <id>3</id>
    <author>someone3</author>
    <url>http://someone3.x2design.net</url>
    <content>hello</content>
    </comment>
    </comments>


    使用JSON表示:

    {comments:[
    {
    id:1,
    author:"someone1",
    url:"http://someone1.x2design.net",
    content:"hello"
    },
    {
    id:2,
    author:"someone2",
    url:"http://someone2.x2design.net",
    content:"hello"
    },
    {
    id:3,
    author:"someone3",
    url:"http://someone3.x2design.net",
    content:"hello"
    }
    ]};


           很容易發現,許多冗余的信息不見了。由于不需要有與開始標簽(opening tag)匹配的結束標簽(closing tag),因此傳送相同的信息所需的字節數大大降低了。創始人 Corockford 將其稱之為“XML 的減肥方案”)。

            JSON 格式的數據與 XML 相比,缺點是對于外行人可讀性更差。當然,有一種觀點是,數據交換格式不是用肉眼觀察的。如果是通過工具對來回傳送的數據進行創建和解析,那么的確沒有理 由要求數據必須使人們易于閱讀。問題的實質在于:存在可用的 JSON 工具。

    3. 服務器端 JSON 工具

    java :java JSON 工具,由Douglas Crock ford 開發,可在 www.crockford.com/JSON/java/

               中下載,它可以在 JSP 中使用。

    4. JSON 優勢與缺點

           JSON不僅減少了解析XML解析帶來的性能問題和兼容性問題,而且對于javascript來說非常容易使用,可以方便的通過遍歷數組以及訪問對象屬性 來獲取數據,其可讀性也不錯,基本具備了結構化數據的性質。不得不說是一個很好的辦法,而且事實上google maps就沒有采用XML傳遞數據,而是采用了JSON方案。

           JSON 另外一個優勢是跨域可行性,例如你在www.xxx.com的網頁里使用是完全可行的,這就意味著你可以跨域傳遞信息。而使用XMLHttpRequest卻獲取不了跨域的信息,這是javascript內部的安全性質所限制的。

           JSON看上去很美,是不是就能完全取代XML呢?事實并非如此,而原因就在于XML的優勢:通用性。要使服務器端產生語法合格的javascript代 碼并不是很容易做到的,這主要發生在比較龐大的系統,服務器端和客戶端有不同的開發人員。它們必須協商對象的格式,這很容易造成錯誤。

    posted @ 2012-05-19 09:27 youngturk 閱讀(572) | 評論 (0)編輯 收藏

    Java 讀寫json格式的文件方法詳解

    一、要解決這個問題首先要知道json格式是什么?

    JSON格式:
    比如學生有學號,姓名,性別等。
    用json表示則為:
    {"studno":"11111","studname":"wwww","studsex":"男"}(各個字段都是字符型)

    這代表一個學生的信息。

    如果多個呢?

    [{"studno":"122222","studname":"wwww","studsex":"男"},
    {"studno":"11111","studname":"xxxx","studsex":"男"},
    {"studno":"33333","studname":"ssss","studsex":"男"}]

    這就是json格式。

    二、那如何操作json格式的文件呢?

    這個更簡單了,說白了就是直接讀寫文件,再把讀出來的文件內容格式化成json就可以了。

    三、具體操作。

    1.我有一個實體類,如下:

    public class ElectSet {
    public String xueqi;
    public String xuenian;
    public String startTime;
    public String endTime;
    public int menshu;
    public String isReadDB;
    //{"xueqi":,"xuenian":,"startTime":,"endTime":,"renshu":,"isReadDB":}
    public String getXueqi() {
       return xueqi;
    }
    public void setXueqi(String xueqi) {
       this.xueqi = xueqi;
    }
    public String getXuenian() {
       return xuenian;
    }
    public void setXuenian(String xuenian) {
       this.xuenian = xuenian;
    }
    public String getStartTime() {
       return startTime;
    }
    public void setStartTime(String startTime) {
       this.startTime = startTime;
    }
    public String getEndTime() {
       return endTime;
    }
    public void setEndTime(String endTime) {
       this.endTime = endTime;
    }
    public int getMenshu() {
       return menshu;
    }
    public void setMenshu(int menshu) {
       this.menshu = menshu;
    }
    public String getIsReadDB() {
       return isReadDB;
    }
    public void setIsReadDB(String isReadDB) {
       this.isReadDB = isReadDB;
    }

    }

    2.有一個json格式的文件,存的就是他的信息,如下

    Sets.json:
    {"xuenian":"2007-2008","xueqi":"1","startTime":"2009-07-19 08:30","endTime":"2009-07-22 18:00","menshu":"10","isReadDB":"Y"}

    3.具體操作.
    /*
    * 取出文件內容,填充對象
    */
    public ElectSet findElectSet(String path){
       ElectSet electset=new ElectSet();
       String sets=ReadFile(path);//獲得json文件的內容
       JSONObject jo=JSONObject.fromObject(sets);//格式化成json對象
       //System.out.println("------------" jo);
       //String name = jo.getString("xuenian");
       //System.out.println(name);
       electset.setXueqi(jo.getString("xueqi"));
       electset.setXuenian(jo.getString("xuenian"));
       electset.setStartTime(jo.getString("startTime"));
       electset.setEndTime(jo.getString("endTime"));
       electset.setMenshu(jo.getInt("menshu"));
       electset.setIsReadDB(jo.getString("isReadDB"));
       return electset;
    }
    //設置屬性,并保存
    public boolean setElect(String path,String sets){
       try {
        writeFile(path,sets);
        return true;
       } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return false;
       }
    }
    //讀文件,返回字符串
    public String ReadFile(String path){
        File file = new File(path);
        BufferedReader reader = null;
        String laststr = "";
        try {
         //System.out.println("以行為單位讀取文件內容,一次讀一整行:");
         reader = new BufferedReader(new FileReader(file));
         String tempString = null;
         int line = 1;
         //一次讀入一行,直到讀入null為文件結束
         while ((tempString = reader.readLine()) != null) {
          //顯示行號
          System.out.println("line " line ": " tempString);
          laststr = laststr tempString;
          line ;
         }
         reader.close();
        } catch (IOException e) {
         e.printStackTrace();
        } finally {
         if (reader != null) {
          try {
           reader.close();
          } catch (IOException e1) {
          }
         }
        }
        return laststr;
    }
             //把json格式的字符串寫到文件
    public void writeFile(String filePath, String sets) throws IOException {
        FileWriter fw = new FileWriter(filePath);
        PrintWriter out = new PrintWriter(fw);
        out.write(sets);
        out.println();
        fw.close();
        out.close();
       }

    4.調用,使用(在網站的controller里調用的)

    //取出json對象
    public void GetElectSettings(HttpServletRequest request,
        HttpServletResponse response) throws Exception {
       ElectSet electset=new ElectSet();
       String absPath = request.getRealPath("\");
       String filePath = absPath "public\sets\electSets.json";
       electset=businessService.findElectSets(filePath);//這里是調用,大家自己改改,我調用的業務層的。
       JSONArray jsonItems = new JSONArray();
       jsonItems.add(electset);
       JSONObject jo=new JSONObject();
       jo.put("data", jsonItems);
       System.out.println(jo);
       request.setCharacterEncoding("utf-8");
       response.setContentType("application/json;charset=utf-8");
       PrintWriter out = response.getWriter();
       out.print(jo);
    }

    //修改json文件
    public void ChangeElectSet(HttpServletRequest request,
        HttpServletResponse response) throws Exception {
       request.setCharacterEncoding("UTF-8");
       response.setContentType("text/json;charset=utf-8");
       log.info("reach ChangeElectSet");
       String json = (String) request.getParameter("json").trim();
       log.info("Change ElectSet");
       log.info(json);
       ElectSet sets = new ElectSet();
       JSONObject jsonObject = JSONObject.fromObject(json);
       sets = (ElectSet) JSONObject.toBean(jsonObject, ElectSet.class);
       if(sets.getIsReadDB()=="false"){
        sets.setIsReadDB("否");
       }
       else{
        sets.setIsReadDB("是");
       }
       String changes="{"xuenian":"";//因為json的屬性要用引號,所以要用"轉義一下
       changes =sets.getXuenian() "","xueqi":"" sets.getXueqi() "","startTime":"" sets.getStartTime() "","endTime":"" sets.getEndTime() "","menshu":"" sets.getMenshu() "","isReadDB":"" sets.getIsReadDB() ""}";
       System.out.println(changes);
       String absPath = request.getRealPath("\");
       String filePath = absPath "public\sets\electSets.json";

    posted @ 2012-05-19 09:09 youngturk 閱讀(1443) | 評論 (0)編輯 收藏

    json 解析ajax

    java返回值:
    modelAndView.put("data", data);
      modelAndView.put("keys", new String[]{"id","vessel_name_en","vessel_name_cn","voyage"});
      modelAndView.setViewPath("/ajax/jsonResult.ftl");

    freemarker 的json值:
    [
     <#list data as row>
      {
       <#list keys as key>
        <#if key_index=keys?size-1>
        "${key}":"${row["${key}"]?default("")}"
        <#else>
        "${key}":"${row["${key}"]?default("")}",
        </#if>
       
       </#list>
      }
      <#if row_index!=data?size-1>
      ,
      </#if>
     </#list>
    ]

    jquery的ajax方法:
    $(document).ready(function(){
     
     $("#vessel_name_en").autocomplete('${webroot}/suggest!vessel.do', {
      mustMatch:false ,
      width:300,
      parse: function(data) {
       return $.map(eval(data), function(row) {
        return {
         //固定就得這么寫
         data: row,
         //匹配內容
         value: row.vessel_name_en,
         //最后回填的數據
         result: row.vessel_name_en
        }
       });
      },
      //顯示的內容
      formatItem: function(item) {
       return item.vessel_name_en +" / "+item.vessel_name_cn+" / "+item.voyage;
      }
     }).result(function(event,item){
      $("#shipInfoId").val(item.id);
      $("#vessel_name_cn").val(item.vessel_name_cn);
      $("#voyage").val(item.voyage);
      $("#bill_no").focus();
     });

    <#macro vesselInfo index=index readonly=true>
    <table class="guide" style="width:100%;" id="base_tbl">
     <tr>
      <th>英文船名</th><td><input type="hidden" name="shipInfoId" value="${index.ship_info_id?if_exists}" id="shipInfoId"/><input name="vesselNameEn" id="vessel_name_en" value="${index.vessel_name_en?if_exists}"/></td>
      <th>中文船名</th><td><input name="vesselNameCn" id="vessel_name_cn" value="${index.vessel_name_cn?if_exists}"/></td>
      
      <th>航次</th><td><input name="voyage" id="voyage" value="${index.voyage?if_exists}"/></td>
      
     </tr>
     </table>

    </#macro>



    posted @ 2012-05-19 00:36 youngturk 閱讀(410) | 評論 (0)編輯 收藏

    Ajax 實現函數 autocomplete

    <html xmlns="http://www.w3.org/1999/xhtml">
     <head id="Head1" runat="server">
         <title>AutoComplate</title>
         <script type="text/javascript" src="js/jquery.min.js"></script>
         <script type="text/javascript" src="js/jquery.autocomplete.min.js"></script>
       
        <link rel="Stylesheet" href="js/css/jquery.autocomplete.css" /> 
       
         <script type="text/javascript">
             $(
    function() {

               var emails = [

                    { name: "Peter Pan", to: "peter@pan.de" },

                    { name: "Molly", to: "molly@yahoo.com" },

                    { name: "Forneria Marconi", to: "live@japan.jp" },

                    { name: "Master <em>Sync</em>", to: "205bw@samsung.com" },

                    { name: "Dr. <strong>Tech</strong> de Log", to: "g15@logitech.com" },

                    { name: "Don Corleone", to: "don@vegas.com" },

                    { name: "Mc Chick", to: "info@donalds.org" },

                    { name: "Donnie Darko", to: "dd@timeshift.info" },

                    { name: "Quake The Net", to: "webmaster@quakenet.org" },

                    { name: "Dr. Write", to: "write@writable.com" }

                    ];
                            
                 $('#content').autocomplete(emails,
                 {
                    width :400,
                    formatItem: function (row, i, max) {  
                     //   var row=eval("("+row+")");//將JSON轉換成對象   
                        return "<table><tr><td align='left'>" + row.name + "</td><td align='right'>約" + row.to + "個寶貝</td></tr></table>";

                     },
                    formatMatch: function(row, i, max){
                       // var obj=eval("("+row+")");//將JSON轉換成對象   
                         return row.name + " " + row.to;

                    } ,

                    formatResult: function(row, i, max) {
                      
                          return row.to;

                      }                
                 });
            

             
               //此處為動態查詢數據例子  (返回Json)
                 $("#keyword").autocomplete("default6.aspx", {
                            minChars: 
    0
                            max:
    10
                            width: 
    400,
                            matchCase:
    false,//不區分大小寫
                          //  matchContains :true,
                           // autoFill: false,
                            scroll: false,
                            dataType: 
    'json',    
                            scrollHeight: 
    500,
                           //此處為傳遞參數
                            extraParams:{v:function() { return $('#keyword').val();}},
                          //需要把data轉換成json數據格式 
                         
                            parse: function(data) {
                               
    return $.map(eval(data), function(row) {
                                   
    return {
                                    data: row,
                                    value: row.Guage,    //此處無需把全部列列出來,只是兩個關鍵列
                                    result: row.Matcode 
                                  }
                            });
                     },
                    formatItem: 
    function(data, i, total) {  
                       
    return "<table><tr><td align='left'>" + data.Guage + "</td><td align='right'> " + data.Unit + " </td></tr></table>"
                        
                     },
                    formatMatch: 
    function(data, i, total) {
                                
    return data.Guage;
                     },
                    formatResult: 
    function(data, value) { 
                              
     return data.Guage;   
                     }
                    }).result(
    function(event, data, formatted) { //回調
                             $('#keyword').val(data.Matcode);   //不知為何自動返回值后總是加了個“,”,所以改成后賦值
                             $(
    "#content").val(data.Guage+data.Unit);
                });
      });  
         
    </script>
     </head>
     <body>
         <form id="form1" runat="server">
         <div>
             <input id="keyword" />
             <input id="content" />
         </div>
         </form>
     </body>
     </html>
    復制代碼

    引用:

    三、參數說明:

    * minChars (Number):

    在觸發autoComplete前用戶至少需要輸入的字符數.Default: 1,如果設為0,在輸入框內雙擊或者刪除輸入框內內容時顯示列表

    * width (Number):

    指定下拉框的寬度. Default: input元素的寬度

    * max (Number):

    autoComplete下拉顯示項目的個數.Default: 10

    * delay (Number):

    擊鍵后激活autoComplete的延遲時間(單位毫秒).Default: 遠程為400 本地10

    * autoFill (Boolean):

    要不要在用戶選擇時自動將用戶當前鼠標所在的值填入到input框. Default: false

    * mustMatch (Booolean):

    如果設置為true,autoComplete只會允許匹配的結果出現在輸入框,所有當用戶輸入的是非法字符時將會得不到下拉框.Default: false

    * matchContains (Boolean):

    決定比較時是否要在字符串內部查看匹配,如ba是否與foo bar中的ba匹配.使用緩存時比較重要.不要和autofill混用.Default: false

    * selectFirst (Boolean):

    如果設置成true,在用戶鍵入tab或return鍵時autoComplete下拉列表的第一個值將被自動選擇,盡管它沒被手工選中(用鍵盤或鼠標).當然如果用戶選中某個項目,那么就用用戶選中的值. Default: true

    * cacheLength (Number):

    緩存的長度.即對從數據庫中取到的結果集要緩存多少條記錄.設成1為不緩存.Default: 10

    * matchSubset (Boolean):

    autoComplete可不可以使用對服務器查詢的緩存,如果緩存對foo的查詢結果,那么如果用戶輸入foo就不需要再進行檢索了,直接使用緩存.通常是打開這個選項以減輕服務器的負擔以提高性能.只會在緩存長度大于1時有效.Default: true

    * matchCase (Boolean):

    比較是否開啟大小寫敏感開關.使用緩存時比較重要.如果你理解上一個選項,這個也就不難理解,就好比foot要不要到FOO的緩存中去找.Default: false

    * multiple (Boolean):

    是否允許輸入多個值即多次使用autoComplete以輸入多個值. Default: false

    * multipleSeparator (String):

    如果是多選時,用來分開各個選擇的字符. Default: ","

    * scroll (Boolean):

    當結果集大于默認高度時是否使用卷軸顯示 Default: true

    * scrollHeight (Number):

    自動完成提示的卷軸高度用像素大小表示 Default: 180 

    * formatItem (Function):

    為每個要顯示的項目使用高級標簽.即對結果中的每一行都會調用這個函數,返回值將用LI元素包含顯示在下拉列表中. Autocompleter會提供三個參數(row, i, max): 返回的結果數組, 當前處理的行數(即第幾個項目,是從1開始的自然數), 當前結果數組元素的個數即項目的個數. Default: none, 表示不指定自定義的處理函數,這樣下拉列表中的每一行只包含一個值.

    * formatResult (Function):

    和formatItem類似,但可以將將要輸入到input文本框內的值進行格式化.同樣有三個參數,和formatItem一樣.Default: none,表示要么是只有數據,要么是使用formatItem提供的值.

    * formatMatch (Function):

    對每一行數據使用此函數格式化需要查詢的數據格式. 返回值是給內部搜索算法使用的. 參數值row

    * extraParams (Object):

    為后臺(一般是服務端的腳本)提供更多的參數.和通常的作法一樣是使用一個鍵值對對象.如果傳過去的值是{ bar:4 },將會被autocompleter解析成my_autocomplete_backend.aspx?q=foo&bar=4 (假設當前用戶輸入了foo). Default: {}

    * result (handler) Returns: jQuery

    此事件會在用戶選中某一項后觸發,參數為:

    event: 事件對象. event.type為result.

    formatted:formatResult函數返回的值

    $("#singleBirdRemote").result(function(event, data, formatted) {

    //如選擇后給其他控件賦值,觸發別的事件等等

    });

    四、注意問題:

    1.網上有人說對中文的檢索時處理有問題,經過測試此版本沒有問題 2.在使用遠程地址時,它默認傳入的參數是:q(輸入值),limit(返回結果的最大值),可以使用extraParams傳入其他的參數

    exmple:
    http://www.2cto.com/kf/201202/118735.html

    posted @ 2012-05-19 00:14 youngturk 閱讀(595) | 評論 (0)編輯 收藏

    僅列出標題
    共33頁: First 上一頁 14 15 16 17 18 19 20 21 22 下一頁 Last 
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導航

    統計

    公告

    this year :
    1 jQuery
    2 freemarker
    3 框架結構
    4 口語英語

    常用鏈接

    留言簿(6)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    相冊

    EJB學習

    Flex學習

    learn English

    oracle

    spring MVC web service

    SQL

    Struts

    生活保健

    解析文件

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 久久精品免费电影| 毛片免费在线观看| 亚洲精品无码久久一线| 最近2018中文字幕免费视频| 亚洲欧洲另类春色校园网站| 国产一区二区三区在线免费观看 | a级成人毛片免费图片| 亚洲视频2020| 免费不卡中文字幕在线| 最近中文字幕无免费| 人妻无码中文字幕免费视频蜜桃| 精品亚洲麻豆1区2区3区| 国产人妖ts在线观看免费视频| 暖暖免费日本在线中文| 在线播放亚洲精品| 久久亚洲AV成人出白浆无码国产| 国产成人免费a在线视频色戒| 免费人妻无码不卡中文字幕系| 在线视频亚洲一区| 亚洲无线电影官网| 免费人成网站在线高清| 黄页网站免费观看| 国色精品va在线观看免费视频 | 成人午夜免费视频| 亚洲xxxx18| 亚洲国产精品婷婷久久| 亚洲情a成黄在线观看| 在线观看免费人成视频| 花蝴蝶免费视频在线观看高清版| 黄页网站在线视频免费| 亚洲精品456人成在线| 亚洲自偷自偷精品| 亚洲综合另类小说色区| 又爽又高潮的BB视频免费看| 美女视频黄是免费的网址| 久久成人免费播放网站| 中文字幕免费在线播放| 一级特黄录像视频免费| 亚洲日韩在线中文字幕综合| 亚洲综合无码一区二区痴汉 | 一级片在线免费看|