Struts2中的OGNL详解

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

首先了解下OGNL的概念

OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能。

此外,还得先需弄懂OGNL的一些知识:

 

1.OGNL表达式的计算是围绕OGNL上下文进行的。

OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类表示。它里面可以存放很多个JavaBean对象。它有一个上下文根对象。

上下文中的根对象可以直接使用名来访问或直接使用它的属性名访问它的属性值。否则要加前缀“#key”。


 

 

2.Struts2的标签库都是使用OGNL表达式来访问ActionContext中的对象数据的。如:<s:propertyvalue="xxx"/>。


 

 

3.Struts2将ActionContext设置为OGNL上下文,并将值栈作为OGNL的根对象放置到ActionContext中。


 

 

4.值栈(ValueStack) :

可以在值栈中放入、删除、查询对象。访问值栈中的对象不用“#”。

Struts2总是把当前Action实例放置在栈顶。所以在OGNL中引用Action中的属性也可以省略“#”。

 

5.调用ActionContext的put(key,value)放入的数据,需要使用#访问。

OGNL中重要的3个符号:#、%、$:

#、%和$符号在OGNL表达式中经常出现,而这三种符号也是开发者不容易掌握和理解的部分,需要时间的积累才渐渐弄清楚……

1.#符号

#符号的用途一般有三种。

—    访问非根对象属性,例如#session.msg表达式,由于Struts 2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。实际上,#相当于ActionContext. getContext();#session.msg表达式相当于ActionContext.getContext().getSession(). getAttribute("msg") 。

—    用于过滤和投影(projecting)集合,如persons.{?#this.age>25},persons.{?#this.name=='pla1'}.{age}[0]。

—    用来构造Map,例如示例中的#{'foo1':'bar1', 'foo2':'bar2'}。

2.%符号

%符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值,这个类似js中的eval,很暴力。

3.$符号

$符号主要有两个方面的用途。

—    在国际化资源文件中,引用OGNL表达式,例如国际化资源文件中的代码:reg.agerange=国际化资源信息:年龄必须在${min}同${max}之间。

—    在Struts 2框架的配置文件中引用OGNL表达式,例如:

 

  1. <validators>    

  2.     <field name="intb">    

  3.             <field-validator type="int">    

  4.             <param name="min">10</param>    

  5.             <param name="max">100</param>    

  6.             <message>BAction-test校验:数字必须为${min}为${max}之间!</message>    

  7.         </field-validator>    

  8.     </field>    

  9. </validators>   

 

下面通过代码对OGNL有更深的了解:

action类OgnlAction.java:

  1. package com.tjcyjd.test.action;  

  2.   

  3. import java.util.Date;  

  4. import java.util.LinkedList;  

  5. import java.util.List;  

  6.   

  7. import javax.servlet.http.HttpServletRequest;  

  8.   

  9. import org.apache.struts2.ServletActionContext;  

  10. import org.apache.struts2.convention.annotation.Action;  

  11. import org.apache.struts2.convention.annotation.Namespace;  

  12. import org.apache.struts2.convention.annotation.ParentPackage;  

  13. import org.apache.struts2.convention.annotation.Result;  

  14. import org.apache.struts2.convention.annotation.Results;  

  15. import org.springframework.stereotype.Controller;  

  16.   

  17. import com.opensymphony.xwork2.ActionContext;  

  18. import com.opensymphony.xwork2.ActionSupport;  

  19.   

  20. @Controller   

  21. @Namespace ("/test")  

  22. @ParentPackage("struts-default")  

  23. @Results ( { @Result (name = "success", location = "/other_test/showognl.jsp"),  

  24.         @Result(name = "fail", location = "/bbs/admin_login.jsp"),  

  25.         @Result(name = "input", location = "/bbs/admin_login.jsp") })  

  26. public class OgnlAction extends ActionSupport {  

  27.     private static final long serialVersionUID = -1494290883433357310L;  

  28.     private List<Person> persons;  

  29.   

  30.     @Action("ognlTest")  

  31.     public String ognlTest() throws Exception {  

  32.         // 获得ActionContext实例,以便访问Servlet API  

  33.         ActionContext ctx = ActionContext.getContext();  

  34.         // 存入application  

  35.         ctx.getApplication().put("msg""application信息");  

  36.         // 保存session  

  37.         ctx.getSession().put("msg""seesion信息");  

  38.         // 保存request信息  

  39.         HttpServletRequest request = ServletActionContext.getRequest();  

  40.         request.setAttribute("msg""request信息");  

  41.         // 为persons赋值  

  42.         persons = new LinkedList<Person>();  

  43.         Person person1 = new Person();  

  44.         person1.setName("pla1");  

  45.         person1.setAge(26);  

  46.         person1.setBirthday(new Date());  

  47.         persons.add(person1);  

  48.   

  49.         Person person2 = new Person();  

  50.         person2.setName("pla2");  

  51.         person2.setAge(36);  

  52.         person2.setBirthday(new Date());  

  53.         persons.add(person2);  

  54.   

  55.         Person person3 = new Person();  

  56.         person3.setName("pla3");  

  57.         person3.setAge(16);  

  58.         person3.setBirthday(new Date());  

  59.         persons.add(person3);  

  60.   

  61.         return SUCCESS;  

  62.   

  63.     }  

  64.   

  65.     public List<Person> getPersons() {  

  66.         return persons;  

  67.     }  

  68.   

  69.     public void setPersons(List<Person> persons) {  

  70.         this.persons = persons;  

  71.     }  

  72. }  


jsp页面showognl.jsp:

  1. <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>    

  2.     

  3. <%@ taglib prefix="s" uri="/struts-tags" %>    

  4. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/ xhtml1/DTD/xhtml1-transitional.dtd">    

  5.     

  6. <html xmlns="http://www.w3.org/1999/xhtml">    

  7.     

  8. <head>    

  9.     

  10.     <title>Struts2 OGNL 演示</title>    

  11.     

  12. </head>    

  13.     

  14. <body>        

  15.     

  16.     <h3>访问OGNL上下文和Action上下文</h3>    

  17.     

  18.     <!-使用OGNL访问属性值-->    

  19.     

  20.     <p>parameters: <s:property value="#parameters.msg" /></p>    

  21.     

  22.     <p>request.msg: <s:property value="#request.msg" /></p>    

  23.     

  24.     <p>session.msg: <s:property value="#session.msg" /></p>    

  25.     

  26.     <p>application.msg: <s:property value="#application.msg" /></p>    

  27.     

  28.     <p>attr.msg: <s:property value="#attr.msg" /></p>    

  29.     

  30.     <hr />    

  31.     

  32.     <h3>用于过滤和投影(projecting)集合</h3>    

  33.     

  34.     <p>年龄大于20</p>    

  35.     

  36.     <ul>    

  37.     

  38.     <!-判断年龄-->    

  39.     

  40.         <s:iterator value="persons.{?#this.age>20}">    

  41.     

  42.             <li><s:property value="name" /> - 年龄:<s:property value="age" /></li>    

  43.     

  44.         </s:iterator>    

  45.     

  46.     </ul>    

  47.     

  48.     <p>姓名为pla1的年龄: <s:property value="persons.{?#this.name=='pla1'}.{age}[0]"/></p>    

  49.     

  50.     <hr />    

  51.     

  52.     <h3>构造Map</h3>    

  53.     

  54.     <s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />    

  55.     

  56.     <p>The value of key "foo1" is <s:property value="#foobar['foo1']" /></p>    

  57.       

  58.     <hr />   

  59.       

  60.     <h4>%符号的用法</h4>    

  61.     

  62.     <s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />    

  63.     

  64.     <p>The value of key "foo1" is <s:property value="#foobar['foo1']" /></p>    

  65.     

  66.     <p>不使用%:<s:url value="#foobar['foo1']" /></p>    

  67.     

  68.     <p>使用%:<s:url value="%{#foobar['foo1']}" /></p>    

  69.     

  70.     <hr />  

  71.         <%    

  72.             request.setAttribute("req", "request scope");    

  73.             request.getSession().setAttribute("sess", "session scope");    

  74.             request.getSession().getServletContext().setAttribute("app",    

  75.                     "aplication scope");    

  76.         %>    

  77.         1.通过ognl表达式获取 属性范围中的值    

  78.         <br>    

  79.         <s:property value="#request.req" />    

  80.         <br />    

  81.         <s:property value="#session.sess" />    

  82.         <br />    

  83.         <s:property value="#application.app" />    

  84.         <br />    

  85.         <hr>    

  86.     

  87.        2.通过<span style="background-color: #fafafa;">ognl表达式创建list 集合 ,并且遍历出集合中的值    

  88.         <br>    

  89.         <s:set name="list" value="{'eeeee','ddddd','ccccc','bbbbb','aaaaa'}"></s:set>    

  90.         <s:iterator value="#list" var="o">    

  91.             <!-- ${o }<br/> -->    

  92.             <s:property />    

  93.             <br />    

  94.         </s:iterator>    

  95.         <br />    

  96.         <hr>    

  97.     

  98.        3.通过ognl表达式创建Map 集合 ,并且遍历出集合中的值    

  99.         <br>    

  100.         <s:set name="map"    

  101.             value="#{'1':'eeeee','2':'ddddd','3':'ccccc','4':'bbbbb','5':'aaaaa'}"></s:set>    

  102.         <s:iterator value="#map" var="o">    

  103.             <!--      ${o.key }->${o.value }<br/>   -->    

  104.             <!-- <s:property value="#o.key"/>-><s:property value="#o.value"/><br/>   -->    

  105.             <s:property value="key" />-><s:property value="value" />    

  106.             <br />    

  107.         </s:iterator>    

  108.         <br />    

  109.         <hr>    

  110.       4.通过ognl表达式 进行逻辑判断    

  111.         <br>    

  112.         <s:if test="'aa' in {'aaa','bbb'}">    

  113.             aa 在 集合{'aaa','bbb'}中;    

  114.         </s:if>    

  115.         <s:else>    

  116.             aa 不在 集合{'aaa','bbb'}中;    

  117.         </s:else>    

  118.         <br />    

  119.         <s:if test="#request.req not in #list">    

  120.                 不 在 集合list中;    

  121.         </s:if>    

  122.         <s:else>    

  123.              在 集合list中;    

  124.         </s:else>    

  125.         <br />    

  126.         <hr>    

  127.           

  128.        5.通过ognl表达式 的投影功能进行数据筛选    

  129.         <br>    

  130.         <s:set name="list1" value="{1,2,3,4,5}"></s:set>    

  131.         <s:iterator value="#list1.{?#this>2}" var="o">    

  132.             <!-- #list.{?#this>2}:在list1集合迭代的时候,从中筛选出当前迭代对象>2的集合进行显示 -->    

  133.             ${o }<br />    

  134.         </s:iterator>    

  135.         <br />    

  136.         <hr>    

  137.        6.通过ognl表达式 访问某个类的静态方法和值    

  138.         <br>    

  139.         <s:property value="@java.lang.Math@floor(32.56)" />    

  140.     

  141.         <s:property value="@com.rao.struts2.action.OGNL1Action@aa" />    

  142.         <br />    

  143.         <br />    

  144.         <hr>    

  145.       7.ognl表达式 迭代标签 详细    

  146.         <br>    

  147.         <s:set name="list2"    

  148.             value="{'aa','bb','cc','dd','ee','ff','gg','hh','ii','jj'}"></s:set>    

  149.         <table border="1">    

  150.             <tr>    

  151.                 <td>索引 </td>    

  152.                 <td></td>    

  153.                 <td>奇?</td>    

  154.                 <td> 偶?</td>    

  155.                 <td>首?</td>    

  156.                 <td> 尾?</td>    

  157.                 <td>当前迭代数量</td>    

  158.             </tr>    

  159.             <s:iterator value="#list2" var="o" status="s">    

  160.                 <tr bgcolor="<s:if test="#s.even">pink</s:if>">    

  161.                     <td>    

  162.                         <s:property value="#s.getIndex()" />    

  163.                     </td>    

  164.                     <td>    

  165.                         <s:property />    

  166.                     </td>    

  167.                     <td>    

  168.                         <s:if test="#s.odd">Y</s:if>    

  169.                         <s:else>N</s:else>    

  170.                     </td>    

  171.                     <td>    

  172.                         <s:if test="#s.even">Y</s:if>    

  173.                         <s:else>N</s:else>    

  174.                     </td>    

  175.                     <td>    

  176.                         <s:if test="#s.first">Y</s:if>    

  177.                         <s:else>N</s:else>    

  178.                     </td>    

  179.                     <td>    

  180.                         <s:if test="#s.isLast()">Y</s:if>    

  181.                         <s:else>N</s:else>    

  182.                     </td>    

  183.                     <td>    

  184.                     <s:property value="#s.getCount()"/>    

  185.                 </td>    

  186.                 </tr>    

  187.             </s:iterator>    

  188.         </table>    

  189.         <br>    

  190.         <hr>         

  191.           

  192.           

  193.        8.ognl表达式:  if/else if/else 详细<br>    

  194.         <% request.setAttribute("aa",0); %>    

  195.         <s:if test="#request.aa>=0 && #request.aa<=4">    

  196.                 在0-4之间;    

  197.         </s:if>    

  198.         <s:elseif test="#request.aa>=4 && #request.aa<=8">    

  199.                 在4-8之间;    

  200.         </s:elseif>    

  201.         <s:else>    

  202.              大于8;    

  203.         </s:else>    

  204.         <br>    

  205.         <hr>    

  206.     9.ognl表达式: url 详细<br>    

  207.         <% request.setAttribute("aa","sss"); %>    

  208.         <s:url action="testAction" namespace="/aa/bb">    

  209.             <s:param name="aa" value="#request.aa"></s:param>    

  210.             <s:param name="id">100</s:param>    

  211.         </s:url>    

  212.         <br/>    

  213.         <s:set name="myurl" value="'http://www.baidu.com'"></s:set>    

  214.         value以字符处理:   <s:url value="#myurl"></s:url><br>    

  215.         value明确指定以ognl表达式处理:    <s:url value="%{#myurl}"></s:url>    

  216.         <br>    

  217.         <hr>    

  218.     10.ognl表达式: checkboxlist 详细<br>    

  219.         1> .list 生成;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>    

  220.         name:checkboxlist的名字<br>    

  221.         list:checkboxlist要显示的列表<br>    

  222.         value:checkboxlist默认被选中的选项,checkedchecked=checked<br>    

  223.         <s:checkboxlist name="checkbox1" list="{'上网','看书','爬山','游泳','唱歌'}" value="{'上网','看书'}" ></s:checkboxlist>    

  224.         <br>    

  225.          以上生成代码:<br>    

  226.         <xmp>    

  227.             <input type="checkbox" name="checkbox1" value="上网" id="checkbox1-1" checked="checked"/>    

  228.             <label for="checkbox1-1" class="checkboxLabel">上网</label>    

  229.             <input type="checkbox" name="checkbox1" value="看书" id="checkbox1-2" checked="checked"/>    

  230.             <label for="checkbox1-2" class="checkboxLabel">看书</label>    

  231.             <input type="checkbox" name="checkbox1" value="爬山" id="checkbox1-3"/>    

  232.             <label for="checkbox1-3" class="checkboxLabel">爬山</label>    

  233.             <input type="checkbox" name="checkbox1" value="游泳" id="checkbox1-4"/>    

  234.             <label for="checkbox1-4" class="checkboxLabel">游泳</label>    

  235.             <input type="checkbox" name="checkbox1" value="唱歌" id="checkbox1-5"/>    

  236.             <label for="checkbox1-5" class="checkboxLabel">唱歌</label>"    

  237.         </xmp>    

  238.         2> .Map 生成;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>    

  239.         name:checkboxlist的名字<br>    

  240.         list:checkboxlist要显示的列表<br>    

  241.         listKey:checkbox 的value的值<br>    

  242.         listValue:checkbox 的lablel(显示的值)<br>    

  243.         value:checkboxlist默认被选中的选项,checkedchecked=checked<br>    

  244.         <s:checkboxlist name="checkbox2" list="#{1:'上网',2:'看书',3:'爬山',4:'游泳',5:'唱歌'}" listKey="key" listValue="value" value="{1,2,5}" ></s:checkboxlist>    

  245.         <br>    

  246.                        以上生成代码:<br>    

  247.         <xmp>    

  248.             <input type="checkbox" name="checkbox2" value="1" id="checkbox2-1" checked="checked"/>    

  249.             <label for="checkbox2-1" class="checkboxLabel">上网</label>    

  250.             <input type="checkbox" name="checkbox2" value="2" id="checkbox2-2" checked="checked"/>    

  251.             <label for="checkbox2-2" class="checkboxLabel">看书</label>    

  252.             <input type="checkbox" name="checkbox2" value="3" id="checkbox2-3"/>    

  253.             <label for="checkbox2-3" class="checkboxLabel">爬山</label>    

  254.             <input type="checkbox" name="checkbox2" value="4" id="checkbox2-4"/>    

  255.             <label for="checkbox2-4" class="checkboxLabel">游泳</label>    

  256.             <input type="checkbox" name="checkbox2" value="5" id="checkbox2-5" checked="checked"/>    

  257.             <label for="checkbox2-5" class="checkboxLabel">唱歌</label>    

  258.         </xmp>    

  259.         <hr>    

  260. </body>    

  261. </html>    

总结OGNL的使用方法:

访问属性

名字属性获取:<s:property value="user.username"/><br>

地址属性获取:<s:property value="user.address.addr"/><br>

访问方法

调用值栈中对象的普通方法:<s:property value="user.get()"/><br>

访问静态属性和方法

调用Action中的静态方法:<s:property value="@struts.action.LoginAction@get()"/>

调用JDK中的类的静态方法:<s:property value="@java.lang.Math@floor(44.56)"/><br>

调用JDK中的类的静态方法(同上):<s:property value="@@floor(44.56)"/><br>

调用JDK中的类的静态方法:<s:property value="@java.util.Calendar@getInstance()"/><br>

调用普通类中的静态属性:<s:property value="@struts.vo.Address@TIPS"/><br>

访问构造方法

调用普通类的构造方法:<s:property value="new struts.vo.Student('李晓红' , '美女' , 3 , 25).username"/>

 

1.5. 访问数组

获取List:<s:property value="testList"/><br>

获取List中的某一个元素(可以使用类似于数组中的下标获取List中的内容):

<s:property value="testList[0]"/><br>

获取Set:<s:property value="testSet"/><br>

获取Set中的某一个元素(Set由于没有顺序,所以不能使用下标获取数据):

<s:property value="testSet[0]"/><br> ×

获取Map:<s:property value="testMap"/><br>

获取Map中所有的键:<s:property value="testMap.keys"/><br>

获取Map中所有的值:<s:property value="testMap.values"/><br>

获取Map中的某一个元素(可以使用类似于数组中的下标获取List中的内容):

<s:property value="testMap['m1']"/><br>

获取List的大小:<s:property value="testSet.size"/><br>

 

访问集合 – 投影、选择(? ^ $)

利用选择获取List中成绩及格的对象:<s:property value="stus.{?#this.grade>=60}"/><br>

利用选择获取List中成绩及格的对象的username:

<s:property value="stus.{?#this.grade>=60}.{username}"/><br>

利用选择获取List中成绩及格的第一个对象的username:

<s:property value="stus.{?#this.grade>=60}.{username}[0]"/><br>

利用选择获取List中成绩及格的第一个对象的username:

<s:property value="stus.{^#this.grade>=60}.{username}"/><br>

利用选择获取List中成绩及格的最后一个对象的username:

<s:property value="stus.{$#this.grade>=60}.{username}"/><br>

利用选择获取List中成绩及格的第一个对象然后求大小:

<s:property value="stus.{^#this.grade>=600}.{username}.size"/><br>

集合的伪属性

OGNL能够引用集合的一些特殊的属性,这些属性并不是JavaBeans模式,例如size(),length()等等. 当表达式引用这些属性时,OGNL会调用相应的方法,这就是伪属性.

集合

伪属性

Collection(inherited by Map, List & Set)

size ,isEmpty

List

iterator

Map

keys , values

Set

iterator

Iterator

next , hasNext

Enumeration

next , hasNext , nextElement , hasMoreElements

 

 Lambda   :[…]

格式::[…]

使用Lambda表达式计算阶乘:

<s:property value="#f = :[#this==1?1:#this*#f(#this-1)] , #f(4)"/><br>

OGNL中#的使用

#可以取出堆栈上下文中的存放的对象.

名称

作用

例子

parameters

包含当前HTTP请求参数的Map

#parameters.id[0]作用相当于

request.getParameter("id")

request

包含当前HttpServletRequest的属性(attribute)的Map

#request.userName相当于

request.getAttribute("userName")

session

包含当前HttpSession的属性(attribute)的Map

#session.userName相当于

session.getAttribute("userName")

application

包含当前应用的ServletContext的属性(attribute)的Map

#application.userName相当于

application.getAttribute("userName")

attr

用于按request > session > application顺序访问其属性(attribute)


 

 

 

 

 

 

 

 

 

 

 

 

 

获取Paraments对象的属性:<s:property value="#parameters.username"/>

OGNL中%的使用

用%{}可以取出存在值堆栈中的Action对象,直接调用它的方法.

例如你的Action如果继承了ActionSupport .那么在页面标签中,用%{getText('key')}的方式可以拿出国际化信息.

 OGNL中$的使用

“$”有两个主要的用途

l         用于在国际化资源文件中,引用OGNL表达式

l         在Struts 2配置文件中,引用OGNL表达式

 值栈

ValueStack对象。这个对象贯穿整个Action的生命周期(每个Action类的对象实例会拥有一个ValueStack对象)。当 Struts 2接收到一个.action的请求后,会先建立Action类的对象实例,但并不会调用Action方法,而是先将Action类的相应属性放到 ValueStack对象的顶层节点(ValueStack对象相当于一个栈)。

在Action中获得ValueStack对象:ActionContext.getContext().getValueStack()

l         Top语法

使用Top获取值栈中的第二个对象:<s:property value="[1].top.对象"/>

l         N语法

使用N获取值栈中的第二个对象:<s:property value="[1].对象"/>

l         @语法

调用action中的静态方法:<s:property value="@vs1@静态方法"/> vs:值栈 1:表示第一个


转载于:https://my.oschina.net/Failure/blog/311466

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264429.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 之 HttpResponse 类

Response 对象&#xff0c;派生自HttpResponse 类&#xff0c;该类封装来自 ASP.NET 操作的 HTTP 响应信息。存在于System.Web命名空间下。 注&#xff1a;MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型就是设定某种扩展名的文件用一种应用程序来打开的…

11个实用的CSS学习工具

为什么80%的码农都做不了架构师&#xff1f;>>> 1. 盒子模型的幻灯片 通过3D转换效果产生的互动的幻灯片。按向左或向右箭头键切换&#xff0c;全屏观看会有更好的效果。 2. CSS Diner 通过一个简单的小游戏让你学习CSS selector&#xff0c;输入正确的selector来完…

Google 节日徽标全集 (1999-2009) (下)

这是 Google 节日徽标全集的第三部分&#xff0c;也是最后一部分&#xff0c;包含 Google 2006 至 2009 年 2 月全部节日徽标。需要指出的是&#xff0c;这些徽标均来自 Google 国际站点&#xff0c;也就是 www.google.com&#xff0c;Google 在众多本地站点上还有大量本土化的…

HBuilder:最快的Web开发IDE

HBuilder&#xff1a;最快的Web开发IDE http://www.csdn.net/article/2014-02-07/2818326-HBuilder-the-fastest-web-ide发表于2014-02-11 10:38| 26194次阅读| 来源CSDN| 59 条评论| 作者CSDN移动前端开发HBuilder数字天堂王安Web开发HTML5DCloud摘要&#xff1a;HBuilder是DC…

Pycharm 项目无法导入自己写的模块(问题记录贴)

问题&#xff1a; 从外部导入一个Python项目后&#xff0c;发现包错误&#xff0c;如图&#xff1a; 解决步骤&#xff1a; 1.将目录下的"5-6——apriori.py"复制一份&#xff0c;重命名为”apriori.py"&#xff1b; 2.查资料知&#xff0c;pycharm不会将当前文…

Win2000/XP/2003路由制作之Nat共享上网

Win2000/XP/2003&#xff08;必须SERVER&#xff08;服务&#xff09;版本的&#xff09;ROUTEROS不会或则你的路由器突然坏了。紧急情况下&#xff0c;为了让老板的网吧正常营业&#xff0c;随手找个电脑就可以正常工作了。好吧。言归正传。NAT服务器软硬件准备俗话说“巧妇难…

Linux中的Interrupted system call错误

2019独角兽企业重金招聘Python工程师标准>>> 最近公司的一个项目&#xff0c;上线时候遇到了一些问题&#xff0c;服务跑一段时间后连接不上。 发现报了Interrupted system call这个错误引起的。 查了下资料&#xff0c;大致原因是系统繁忙处理不过来导致的。 根据网…

JAVA格式化当前日期或者取年月日

Date d new Date(); System.out.println(d); SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateNowStr sdf.format(d); System.out.println("格式化后的日期&#xff1a;" dateNowStr); 转载于:https://www.cnblo…

ubuntu查看硬件信息

ubuntu查看硬件信息 1,外部探针probe sudo apt-get install hwinfo 执行hwinfo获取系统信息 --short 2,系统命令dmidecode(硬件信息) or dmesg(主要是开机信息) 基于命令ubuntu 系统硬件信息查看 主板信息,序列号,产品名 dmesg | grep -i cpu dmidecode -t processor 硬盘(分区…

linux win10虚拟内存,高手解惑win10系统电脑虚拟内存不足的还原技巧

我们在使用电脑的时候&#xff0c;难免会遇到win10系统电脑虚拟内存不足的情况&#xff0c;根据小编的调查并不是所有的朋友都知道win10系统电脑虚拟内存不足的问题怎么解决&#xff0c;针对win10系统电脑虚拟内存不足的问题&#xff0c;我给大家整理总结了详细的解决步骤&…

linux python3运行,将Python3安装到Linux上并运行

将Python3安装到Linux上并运行使用win10开发一个很好的python项目并把它部署到Linux中&#xff0c;有一个问题需要解决&#xff1a;如何在Linux中运行py文件&#xff1f;以LunixCentOS7.x平台为例&#xff0c;CentOS系统已经有了python2.x的自带版本&#xff0c;可以通过命令查…

LINQ to SQL学习的几个问题

问题一&#xff1a; 什么情况下我们使用自动属性功能&#xff0c;生成自动属性时内部没有明确的私有变量那么我们如何访问这个私有变量呢&#xff1f; 如果不能那我们的封装还有什么存在的意义&#xff1f; Code1 /**//// <summary> 2 /// net 2.0中使用的方法来定义…

C# foreach遇到async和await

一个简单的列子&#xff0c;需要把一个集合的数据添加到数据库中。 我先这样写了&#xff0c;然后报错了 public async Task<IHttpActionResult> Test([FromUri]string name ""){List<string> strList new List<string>() { "测试", &…

MVC RC2中关于HtmlHelper给DropDownList设置初始选中值的问题

Asp.Net MVC RC2中Helper提供的DropDownList好象并不太好用&#xff0c;特别想给下拉框设置初始选中值的时候&#xff08;可能我还没找到正确的方法&#xff09; 小试了一下&#xff0c;有二个简单的解决办法:1.回到最原始的asp的办法&#xff0c;直接在view的循环中判断&#…

linux硬盘检测工具,CrazyDiskInfo 硬盘检测工具 Linux版 | 厘米天空

之前本站介绍过CrystalDiskInfo这款windows下的硬盘检测工具&#xff0c;今天来看看Linux下的版本CrazyDiskInfo。CrazyDiskInfo是一款用于Unix类系统的交互式TUI S.M.A.R.T查看器&#xff0c;可以查看硬盘健康情况&#xff0c;是否有坏扇区等。项目地址&#xff1a;https://gi…

linux 远程图形终端,图形终端远程操作Linux

一、想要在远程终端运用图形界面来操作和控制Linux效劳器&#xff0c;就在windows下像运用MSTSC(远程桌面)一样。linux经过XDMCP来提供这种支持&#xff0c;我们只需用一个终端仿真软件&#xff1a;xmanager&#xff0c;但是装完Xmanager后是不能直接远程衔接Linux效劳器的Xwin…

windows下nginx的安装及使用

1.下载nginx http://nginx.org/en/download.html 下载稳定版本&#xff0c;以nginx/Windows-1.12.2为例&#xff0c;直接下载 nginx-1.12.2.zip 下载后解压&#xff0c;解压后如下 2.启动nginx 有很多种方法启动nginx (1)直接双击nginx.exe&#xff0c;双击后一个黑色的…

win8.1出现 called runscript when not marked in progress

1.打开任务管理器-详细信息-结束图片中选择的进程 2.然后在任务管理器左上角“文件“>运行新任务&#xff1a; 输入C:\\Windows\explorer.exe&#xff0c;并勾选”以系统管理权限创建此任务“&#xff0c;点击确定&#xff1a; 3.这样就可以继续安装了。 转载于:https://www…

学游泳

今天上午又去了人大附中&#xff0c;门紧锁着&#xff0c;去正门一问才知道&#xff0c;要周末下午1点30才开门&#xff0c;平时是5点30。回家吧&#xff0c;外面居然下起了星星点点的小雪&#xff0c;北京的三月…… 学蛙泳 老旱四诀之蛙泳 分手压腕, 双锚拉纤, 高肘抱水, 翻…

Linux ftp ldap认证,vsftpd+ldap认证

一、环境系统 CentOS 6.4x64最小化安装IP 192.168.3.19二、安装ldap[roottest ~]# yum install openldap openldap-* -y[roottest ~]# yum install nscd nss-pam-ldapd nss-* pcre pcre-* -y配置ldap[roottest ~]# cd /etc/openldap/[roottest openldap]# cp /usr/sha…