MongoDB+Struts2+JQuery.formValidator外掛的web應用示例
- /**
- * 此次應用涉及的幾個小知識點為:
- * 1.MongoDB的插入和更新操作
- * 2.Struts2的最基本使用
- * 3.單例設計模式的簡單使用
- * 4.JQuery form驗證表單外掛的使用
- */
- /**
- * MongoDBWebTest
- * 註冊
- */
- package com.labci.mongodb.web.action;
- import java.util.Iterator;
- import java.util.Map;
- import javax.servlet.http.HttpServletRequest;
- import net.sf.json.JSONArray;
- import org.apache.struts2.interceptor.ServletRequestAware;
- import com.labci.mongodb.web.util.GenderEnum;
- import com.labci.mongodb.web.util.JSONToMapUtil;
- import com.labci.mongodb.web.util.MongoDBUtil;
- import com.labci.mongodb.web.util.NumbericUtil;
- import com.mongodb.BasicDBObject;
- import com.mongodb.DBCollection;
- import com.mongodb.DBCursor;
- import com.mongodb.DBObject;
- import com.opensymphony.xwork2.ActionSupport;
- /**
- * @author Bill Tu(tujiyue/iwtxokhtd)
- * Jun 11, 2011[10:27:12 PM]
- *
- */
- public class RegisterAction extends ActionSupport implements ServletRequestAware{
- /**
- *
- */
- private static final long serialVersionUID = -6732943120575582727L;
- private HttpServletRequest request;
- private static final String USER="user";
- @Override
- public String execute() throws Exception {
- String username=request.getParameter("username");
- String password=request.getParameter("password");
- String ageStr=request.getParameter("age");
- String birth=request.getParameter("birth");
- int age=getAge(ageStr);
- String gender=request.getParameter("gender");
- if(gender.equals("0")){
- gender=GenderEnum.MALE.getGenderValue();
- }else{
- gender=GenderEnum.FEMALE.getGenderValue();
- }
- String idCardNo=request.getParameter("idCardNo");
- String email=request.getParameter("email");
- String telNo=request.getParameter("telephoneNo");
- String phoneNo=request.getParameter("phoneNo");
- String education=request.getParameter("education");
- String []interests=request.getParameterValues("interests");
- String desc=request.getParameter("desc");
- //使用者表
- DBCollection userCollection=MongoDBUtil.getCollection(USER);
- if(null!=username && !"".equals(username)){
- DBObject queryByName=new BasicDBObject();
- queryByName.put("username", username);
- DBCursor findByName=userCollection.find(queryByName);
- Iterator<DBObject> iter=findByName.iterator();
- if(!iter.hasNext()){
- DBObject user=new BasicDBObject();
- user.put("username", username);
- user.put("password", password);
- user.put("age", age);
- user.put("birth", birth);
- user.put("gender", gender);
- user.put("idCardNo", idCardNo);
- user.put("email", email);
- user.put("telephoneNo", telNo);
- user.put("phoneNo", phoneNo);
- user.put("education", education);
- int len=interests.length;
- if(null!=interests && len>0){
- Object []interestsArray=new Object[len];
- for(int i=0;i<len;i++){
- interestsArray[i]=interests[i];
- }
- user.put("interests", interestsArray);
- }
- user.put("desc", desc);
- userCollection.save(user);
- request.getSession().setAttribute("username", username);
- DBObject findByUsername=userCollection.findOne(queryByName);
- if(null!=findByUsername){
- Map<String,Object> userMap=JSONToMapUtil.parseToMap(findByUsername.toString());
- JSONArray interestsArray=JSONArray.fromObject(userMap.get("interests"));
- request.setAttribute("interest", interestsArray.toArray());
- request.setAttribute("userMap", userMap);
- }
- }
- }
- return SUCCESS;
- }
- private int getAge(String ageStr){
- int age=18;//預設為18歲,成年人
- if(NumbericUtil.isInteger(ageStr)){
- age=Integer.parseInt(ageStr);
- age=age<1?1:age>100?100:age;
- }
- return age;
- }
- public void setServletRequest(HttpServletRequest arg0) {
- this.request=arg0;
- }
- }
- /**
- * MongoDBWebTest
- * 去更新頁面
- */
- package com.labci.mongodb.web.action;
- import java.util.Map;
- import javax.servlet.http.HttpServletRequest;
- import net.sf.json.JSONArray;
- import org.apache.struts2.interceptor.ServletRequestAware;
- import com.labci.mongodb.web.util.JSONToMapUtil;
- import com.labci.mongodb.web.util.MongoDBUtil;
- import com.mongodb.BasicDBObject;
- import com.mongodb.DBCollection;
- import com.mongodb.DBObject;
- import com.opensymphony.xwork2.ActionSupport;
- /**
- * @author Bill Tu(tujiyue/iwtxokhtd)
- * Jun 11, 2011[10:27:12 PM]
- *
- */
- public class ToUpdateAction extends ActionSupport implements ServletRequestAware{
- /**
- *
- */
- private static final long serialVersionUID = -6732943120575582727L;
- private HttpServletRequest request;
- private static final String USER="user";
- @Override
- public String execute() throws Exception {
- String username=(String) request.getSession().getAttribute("username");
- if(null!=username && !"".equals(username)){
- DBCollection userCollection=MongoDBUtil.getCollectionNotByAuth(USER);
- DBObject queryByName=new BasicDBObject();
- queryByName.put("username", username);
- DBObject findByUsername=userCollection.findOne(queryByName);
- if(null!=findByUsername){
- Map<String,Object> userMap=JSONToMapUtil.parseToMap(findByUsername.toString());
- JSONArray interestsArray=JSONArray.fromObject(userMap.get("interests"));
- request.setAttribute("interest", interestsArray.toArray());
- request.setAttribute("userMap", userMap);
- }
- }
- return SUCCESS;
- }
- public void setServletRequest(HttpServletRequest arg0) {
- this.request=arg0;
- }
- }
- /**
- * MongoDBWebTest
- * 更新操作
- */
- package com.labci.mongodb.web.action;
- import java.util.Map;
- import javax.servlet.http.HttpServletRequest;
- import net.sf.json.JSONArray;
- import org.apache.struts2.interceptor.ServletRequestAware;
- import com.labci.mongodb.web.util.GenderEnum;
- import com.labci.mongodb.web.util.JSONToMapUtil;
- import com.labci.mongodb.web.util.MongoDBUtil;
- import com.labci.mongodb.web.util.NumbericUtil;
- import com.mongodb.BasicDBObject;
- import com.mongodb.DBCollection;
- import com.mongodb.DBObject;
- import com.opensymphony.xwork2.ActionSupport;
- /**
- * @author Bill Tu(tujiyue/iwtxokhtd)
- * Jun 11, 2011[10:27:12 PM]
- *
- */
- public class UpdateAction extends ActionSupport implements ServletRequestAware{
- /**
- *
- */
- private static final long serialVersionUID = -6732943120575582727L;
- private HttpServletRequest request;
- private static final String USER="user";
- @Override
- public String execute() throws Exception {
- String username=(String) request.getSession().getAttribute("username");
- if(null!=username && !"".equals(username)){
- DBCollection userCollection=MongoDBUtil.getCollectionNotByAuth(USER);
- String ageStr=request.getParameter("age");
- String birth=request.getParameter("birth");
- int age=getAge(ageStr);
- String gender=request.getParameter("gender");
- if(gender.equals("0")){
- gender=GenderEnum.MALE.getGenderValue();
- }else{
- gender=GenderEnum.FEMALE.getGenderValue();
- }
- String idCardNo=request.getParameter("idCardNo");
- String email=request.getParameter("email");
- String telNo=request.getParameter("telephoneNo");
- String phoneNo=request.getParameter("phoneNo");
- String education=request.getParameter("education");
- String []interests=request.getParameterValues("interests");
- String desc=request.getParameter("desc");
- DBObject condition=new BasicDBObject();
- condition.put("username", username);
- DBObject update=new BasicDBObject();
- update.put("age", age);
- update.put("birth", birth);
- update.put("gender", gender);
- update.put("idCardNo", idCardNo);
- update.put("telephoneNo", telNo);
- update.put("phoneNo", phoneNo);
- update.put("education", education);
- update.put("email", email);
- update.put("interests", interests);
- update.put("desc", desc);
- DBObject setValue=new BasicDBObject();
- setValue.put("$set", update);
- userCollection.update(condition, setValue);
- DBObject findByUsername=userCollection.findOne(condition);
- if(null!=findByUsername){
- Map<String,Object> userMap=JSONToMapUtil.parseToMap(findByUsername.toString());
- JSONArray interestsArray=JSONArray.fromObject(userMap.get("interests"));
- request.setAttribute("interest", interestsArray.toArray());
- request.setAttribute("userMap", userMap);
- }
- }
- return SUCCESS;
- }
- private int getAge(String ageStr){
- int age=18;//預設為18歲,成年人
- if(NumbericUtil.isInteger(ageStr)){
- age=Integer.parseInt(ageStr);
- age=age<1?1:age>100?100:age;
- }
- return age;
- }
- public void setServletRequest(HttpServletRequest arg0) {
- this.request=arg0;
- }
- }
- /**
- * MongoDBWebTest
- * 性別列舉類
- */
- package com.labci.mongodb.web.util;
- /**
- * @author Bill Tu(tujiyue/iwtxokhtd)
- * Jun 11, 2011[10:54:08 PM]
- *
- */
- public enum GenderEnum {
- MALE{
- public String getGenderValue(){
- return "男";
- }
- },
- FEMALE{
- public String getGenderValue(){
- return "女";
- }
- };
- public abstract String getGenderValue();
- }
- /**
- * MongoDBWebTest
- *
- */
- package com.labci.mongodb.web.util;
- import java.util.HashMap;
- import java.util.Iterator;
- import java.util.Map;
- import net.sf.json.JSONObject;
- /**
- * @author Bill Tu(tujiyue/iwtxokhtd)
- * Jun 12, 2011[2:51:54 PM]
- *
- */
- public class JSONToMapUtil {
- private JSONToMapUtil(){
- }
- @SuppressWarnings("unchecked")
- public static Map<String,Object> parseToMap(String s){
- Map<String,Object> map=new HashMap<String,Object>();
- JSONObject json=JSONObject.fromObject(s);
- Iterator keys=json.keys();
- while(keys.hasNext()){
- String key=(String) keys.next();
- String value=json.get(key).toString();
- if(value.startsWith("{")&&value.endsWith("}")){
- map.put(key, parseToMap(value));
- }else{
- map.put(key, value);
- }
- }
- return map;
- }
- }
- /**
- * MongoDBWebTest
- * 取得資料庫連線的工具類
- */
- package com.labci.mongodb.web.util;
- import java.net.UnknownHostException;
- import java.util.Map;
- import java.util.concurrent.ConcurrentHashMap;
- import com.mongodb.DB;
- import com.mongodb.DBCollection;
- import com.mongodb.Mongo;
- import com.mongodb.MongoException;
- /**
- * @author Bill Tu(tujiyue/iwtxokhtd)
- * Jun 11, 2011[10:05:00 PM]
- *
- */
- public class MongoDBUtil {
- private static final String HOST="host";
- private static final String PORT="port";
- private static final String USER="user";
- private static final String PASSWORD="password";
- private static final String DBNAME="dbname";
- private static Map<String,Mongo> dbConnsMap=new ConcurrentHashMap<String,Mongo>();
- private static final Map<String,String> dbInfoMap=ParseFileInfo.getIntance().getDbInfoMap();
- private MongoDBUtil(){
- }
- public static Mongo getConnection(){
- Mongo conn=dbConnsMap.get("test");
- if(null==conn){
- synchronized(MongoDBUtil.class){
- if(null==conn){
- //這種方式在jdk1.5及以上版本上沒有問題
- try {
- conn=new Mongo(dbInfoMap.get(HOST),Integer.parseInt(dbInfoMap.get(PORT)));
- } catch (NumberFormatException e) {
- e.printStackTrace();
- } catch (UnknownHostException e) {
- e.printStackTrace();
- } catch (MongoException e) {
- e.printStackTrace();
- }
- dbConnsMap.put("test", conn);
- }
- }
- }
- return conn;
- }
- public static DBCollection getCollection(String collectionName){
- DBCollection collection=null;
- boolean isLogin=true;
- DB db=getConnection().getDB(dbInfoMap.get(DBNAME));
- if(null != db){
- isLogin=db.authenticate(dbInfoMap.get(USER), dbInfoMap.get(PASSWORD).toCharArray());
- }
- if(isLogin){
- collection=db.getCollection(collectionName);
- if(null==collection){
- synchronized(MongoDBUtil.class){
- if(null==collection){
- collection=db.createCollection(collectionName, null);
- }
- }
- }
- }
- return collection;
- }
- public static DBCollection getCollectionNotByAuth(String collectionName){
- DBCollection collection=null;
- DB db=getConnection().getDB(dbInfoMap.get(DBNAME));
- if(null != db){
- collection=db.getCollection(collectionName);
- if(null==collection){
- synchronized(MongoDBUtil.class){
- if(null==collection){
- collection=db.createCollection(collectionName, null);
- }
- }
- }
- }
- return collection;
- }
- }
- /**
- * MongoDBWebTest
- * 判斷是否是數字的工具類
- */
- package com.labci.mongodb.web.util;
- import java.util.regex.Pattern;
- /**
- * @author Bill Tu(tujiyue/iwtxokhtd)
- * Jun 11, 2011[10:38:33 PM]
- *
- */
- public class NumbericUtil {
- private NumbericUtil(){
- }
- public static boolean isDigits(String input){
- boolean flag=false;
- if(!isStringNull(input)){
- String regex="^[//d]+[//.]?[//d]+$";
- Pattern p=Pattern.compile(regex);
- flag=p.matcher(input).matches();
- }
- return flag;
- }
- public static boolean isInteger(String input){
- boolean flag=false;
- if(!isStringNull(input)){
- String regex="^[-+]?[//d]+$";
- Pattern p=Pattern.compile(regex);
- flag=p.matcher(input).matches();
- }
- return flag;
- }
- public static boolean isDouble(String input){
- boolean flag=false;
- if(!isStringNull(input)){
- String regex="^[//d]+[//.][//d]+$";
- Pattern p=Pattern.compile(regex);
- flag=p.matcher(input).matches();
- }
- return flag;
- }
- private static boolean isStringNull(String input){
- boolean isNull=false;
- if(null==input ||"".equals(input.trim())||input.length()<=0){
- isNull=true;
- }
- return isNull;
- }
- }
- /**
- * MongoDBWebTest
- * 解析db屬性檔案的類
- */
- package com.labci.mongodb.web.util;
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.Enumeration;
- import java.util.HashMap;
- import java.util.Map;
- import java.util.Properties;
- /**
- * @author Bill Tu(tujiyue/iwtxokhtd)
- * Jun 11, 2011[9:43:02 PM]
- *
- */
- public class ParseFileInfo {
- private static Properties configFile=null;
- private static final String DB_CONFIG_FILE_NAME="db.properties";
- private ParseFileInfo(){
- configFile=new Properties();
- }
- private static class ParseFileInfoHolder{
- private static ParseFileInfo instance=new ParseFileInfo();
- }
- public static ParseFileInfo getIntance(){
- return ParseFileInfoHolder.instance;
- }
- public Map<String,String> getDbInfoMap(){
- InputStream is=ParseFileInfo.class.getResourceAsStream("/"+DB_CONFIG_FILE_NAME);
- Map<String,String> dbInfoMap=new HashMap<String,String>();
- if(null != is){
- try {
- configFile.load(is);
- } catch (IOException e) {
- e.printStackTrace();
- }
- Enumeration<Object> fileKeys=configFile.keys();
- while(fileKeys.hasMoreElements()){
- String keyName=(String) fileKeys.nextElement();
- dbInfoMap.put(keyName, configFile.getProperty(keyName));
- }
- }
- return dbInfoMap;
- }
- }
db.properties
- host=192.168.1.86
- port=27017
- user=iwtxokhtd
- password=123456
- dbname=test
struts.xml
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE struts PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
- "http://struts.apache.org/dtds/struts-2.0.dtd">
- <struts>
- <constant name="struts.devMode" value="false" />
- <!-- 改變struts2預設為2M的上傳檔案大小限制 -->
- <constant name="struts.multipart.maxSize" value="1024000000"/>
- <package name="mongoDB" extends="struts-default">
- <action name="register" class="com.labci.mongodb.web.action.RegisterAction">
- <result name="success">viewInfo.jsp</result>
- <result name="input">index.jsp</result>
- </action>
- <action name="toUpdate" class="com.labci.mongodb.web.action.ToUpdateAction">
- <result name="success">updateInfo.jsp</result>
- </action>
- <action name="update" class="com.labci.mongodb.web.action.UpdateAction">
- <result name="success">viewInfo.jsp</result>
- <result name="input">updateInfo.jsp</result>
- </action>
- </package>
- </struts>
validator.js
- $(document).ready(function(){
- $.formValidator.initConfig({formid:"register",onerror:function(msg){alert(msg);return false;},onsuccess:function(){alert('ddd');return true;}});
- $("#username").formValidator({tipid:"nameTip",onshow:"必填",onfocus:"使用者名稱至少6個字元,最多20個字元",oncorrect:"該使用者名稱可以註冊"}).inputValidator({min:6,max:20,onerror:"你輸入的使用者名稱不合法,請確認"}).regexValidator({regexp:"username",datatype:"enum",onerror:"使用者名稱格式不正確"});
- $("#password").formValidator({tipid:"passwordTip1",onshow:"必填",onfocus:"密碼不能為空,至少6位",oncorrect:"密碼輸入合法"}).inputValidator({min:6,empty:{leftempty:false,rightempty:false,emptyerror:"密碼兩邊不能有空格"},onerror:"密碼不能為空,請確認"});
- $("#password2").formValidator({tipid:"passwordTip2",onshow:"必填",onfocus:"兩次密碼輸入必須一致哦",oncorrect:"密碼確認正確"}).inputValidator({min:6,empty:{leftempty:false,rightempty:false,emptyerror:"重複密碼兩邊不能有空格"},onerror:"重複密碼不能為空,請確認"}).compareValidator({desid:"password",operateor:"=",onerror:"兩次密碼輸入不一致,請重新確認"});
- $(":radio[name='gender']").formValidator({tipid:"genderTip",onshow:"必填",onfocus:"預設為男性",oncorrect:"性別選擇正確",defaultvalue:["0"]}).inputValidator({min:1,max:1,onerror:"性別忘記選了,請確認"});
- $("#age").formValidator({onshow:"必填",onfocus:"請輸入年齡,範圍在18至100之間",oncorrect:"恭喜你,你輸對了"}).inputValidator({min:18,max:100,type:"value",onerrormin:"你輸入的值必須大於等於18",onerror:"年齡必須在18-100之間,請確認"});
- $("#birth").focus(function(){WdatePicker({skin:'whyGreen',oncleared:function(){$(this).blur();},onpicked:function(){$(this).blur();}})}).formValidator({onshow:"必填",onfocus:"請選擇出生日期",oncorrect:"出生日期輸入合法"}).inputValidator({min:"1900-01-01",max:"2099-01-01",type:"date",onerror:"日期必須在/"1900-01-01/"和/"2099-01-01/"之間"});
- $("#idCardNo").formValidator({onshow:"可選",onfocus:"請輸入15或18位身份證",oncorrect:"輸入正確"}).functionValidator({fun:isCardID});
- $("#email").formValidator({onshow:"必填",onfocus:"必須輸入合法的郵箱地址",oncorrect:"郵箱填寫正確",forcevalid:true}).inputValidator({min:6,max:100,onerror:"郵箱地址的長度限制在6至100字元以內"}).regexValidator({regexp:"^([//w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([//w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$",onerror:"你輸入的郵箱格式不正確"});
- $("#education").formValidator({onshow:"必填",onfocus:"請選擇真實的學歷",oncorrect:"學歷選擇正確"}).inputValidator({min:1,onerror: "學歷不能丟!"});
- $(":checkbox[name='interests']").formValidator({tipid:"interestsTip",onshow:"必須選擇一個",onfocus:"得選擇1個",oncorrect:"興趣愛好已選"}).inputValidator({min:1,onerror:"沒選擇好哦"});
- $("#telephoneNo").formValidator({empty:true,onshow:"可選",onfocus:"最好是留一下吧",oncorrect:"手機號碼填寫正確",onempty:"還真不留"}).inputValidator({min:11,max:11,onerror:"手機號碼必須是11位的,請確認"}).regexValidator({regexp:"mobile",datatype:"enum",onerror:"你輸入的手機號碼格式不正確"});;
- $("#phoneNo").formValidator({empty:true,onshow:"可選",onfocus:"格式例如:0755-66666666",oncorrect:"聯絡電話填寫正確",onempty:"哎,真得沒留"}).regexValidator({regexp:"^[[0-9]{3}-|/[0-9]{4}-]?([0-9]{8}|[0-9]{7})?$",onerror:"你輸入的聯絡電話格式不正確"});
- $("#desc").formValidator({onshow:"必填",onfocus:"描述至少要輸入10個漢字或20個字元",oncorrect:"輸入合法",defaultvalue:"得寫點東東..."}).inputValidator({min:20,onerror:"你輸入的描述長度不正確,請確認"});
- });
validator.css
- .onCorrect
- {
- background:url(../images/reg4.gif) no-repeat;
- padding-left:25px;
- font-size: 12px;
- line-height:22px;
- vertical-align:middle;
- }
- .onShow
- {
- background:url(../images/reg1.gif) no-repeat;
- padding-left:25px;
- font-size: 12px;
- line-height:22px;
- vertical-align:middle;
- }
- .onFocus
- {
- background:#E9F0FF url(../images/reg2.gif) no-repeat;
- padding-left:25px;
- font-size: 12px;
- line-height:22px;
- vertical-align:middle;
- }
- .onError
- {
- background:#FFF2E9 url(../images/reg3.gif) no-repeat;
- padding-left:25px;
- font-size: 12px;
- line-height:22px;
- vertical-align:middle;
- }
- .onLoad
- {
- background:#E9FFEB url(../images/loading.gif) no-repeat 3px 3px;
- padding-left:25px;
- font-size: 12px;
- line-height:22px;
- vertical-align:middle;
- }
web.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
- http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
- <filter>
- <filter-name>struts2</filter-name>
- <filter-class>
- org.apache.struts2.dispatcher.FilterDispatcher
- </filter-class>
- </filter>
- <filter-mapping>
- <filter-name>struts2</filter-name>
- <url-pattern>*.action</url-pattern>
- </filter-mapping>
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
- </web-app>
相關文章
- 使用 jQuery UI 和 jQuery 外掛構建更好的 Web 應用程式jQueryUIWeb
- fullpage外掛基本應用
- artDialog外掛應用
- uploadify外掛的功能應用
- 常用web外掛Web
- bigSlide 外掛應用IDE
- react 的pdf預覽外掛應用React
- 8個超實用的jQuery外掛應用jQuery
- jQuery Ajax應用與常用外掛jQuery
- 資料統計表外掛,highcharts外掛的簡單應用
- Web前端常用外掛Web前端
- 基於 webpack 的 SPA 單頁 Web 應用 動態載入外掛的機制Web
- Java外掛開發入門示例Java
- iptables深入解析:應用層外掛篇
- 外掛化知識梳理(1) Small 框架之如何引入應用外掛框架
- 基於web/h5應用的外掛/擴充套件/業務剝離方案設計WebH5套件
- 炫酷實用的HTML5應用和jQuery外掛HTMLjQuery
- 一個輕APP場景應用-外掛APP
- 示例可重用的web component方式組織angular應用模組WebAngular
- Web前端開發Chrome外掛Web前端Chrome
- WEB 前端開發外掛整理Web前端
- Vault外掛示例--Vault Explorer與Thin Client的整合。client
- Java中的編譯器外掛開發與應用Java編譯
- 如何從外網訪問本地WEB應用?Web
- 使用 Serverless Devs 外掛快速部署前端應用Serverdev前端
- 金山WPS應用:三款最具特色外掛
- Web開發者必備的20款 jQuery 外掛WebjQuery
- React實用外掛React
- iframe自適應高度的外掛
- Flutter Web 外掛開發小記FlutterWeb
- 7個Web開發者高階外掛Web
- 應用於Android無埋點的Gradle外掛解析AndroidGradle
- 應用於網站導航中的 15 個 jQuery 外掛網站jQuery
- 有關ERP應用外掛開發的探討(轉)
- 探索Semantic Kernel內建外掛:深入瞭解HttpPlugin的應用HTTPPlugin
- web的自動化測試外掛Selenium-IDE外掛的安裝使用WebIDE
- Holer實現手機APP應用外網訪問本地WEB應用APPWeb
- vue預渲染之prerender-spa-plugin外掛應用VuePlugin