遇到了WEB界面访问自己编写的类的问题:网页上按一个按钮,实现后台数据的插入与查询。
经过网上搜索,找到两种实现方式:AJAX和DWR。据说DWR是基于AJAX的,用起来更方便,果断选择DWR。
不过在用的时候遇到很多问题,在此记录要点,方便后面查询。
-------------------------------------Eclipse + JAVA1.8 + Tomcat9.0---------------------------------
具体的DWR使用流程,网上的资料都很多了:
最官方最权威的:http://directwebremoting.org/dwr/introduction/getting-started.html
网友的一些例子则可以直接去百度“DWR”。
在此只说明一些要点。
1.网上的例子说,把dwr.jar和commons-logging.jar下载下来,放到自己工程的WEB-INF/lib下就可以了。不过在网上学习的时候,有人提过把下图中的dwrdemo下载下来,然后把里面的WEB-INF\lib下的所有.jar文件都拷贝过来,放到自己的WEB-INF/lib下,个人偏于保守,所有还是都放过来了。
2.上面提到的dwrdemo.war,是官方给的dwr应用的例子,所以最好还是下载下来,里面的web.xml和dwr.xml等都可以拿过来直接改,用到自己的工程里
3.关于web.xml文件:
以下部分直接复制进自己的web.xml文件,一点都不要改!注意,一点都不要改。我曾经还去考虑每句话是咋回事,是不是需要根据自己的WEB工程做修改,实际证明,一点都别改!
<servlet>
<display-name>DWR Servlet</display-name>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
4.关于dwr.xml文件:
<dwr>
<allow>
<create creator="new" javascript="MyTransaction">
<param name="class" value="Transaction"/>
</create>
</allow>
</dwr>
这些内容先直接复制过来,然后稍作修改。
上面的 value="Transaction" 引号里的Transaction,就是你在javascript里想要使用的外部类的名字
上面的 javascript="MyTransaction" 引号里的MyTransaction,就是你在javascript里使用上面提到的这个类的时候,用的名字
也就是说,我定义了一个类,名字叫做"Transaction",假如它有一个方法(成员函数)叫做save(String name);,在javascript里我想用它,怎么用呢,直接"MyTransaction.save(name1)"就完了,name1是一个String。
5.web工程里,把Build Path改到WEB-INF/classes下。具体步骤:
单击web工程,然后右键->属性->Java Build Path->Source,下面的Browser选到WEB-INF/classes下,有可能只能选到WEB-INF一级,那就自己创建一个classes文件夹。
6.上面步骤一旦成功,运行Tomcat,在地址栏输入http://localhost:你的端口号/你的WEB工程名/dwr/,则会出现dwr成功认出的东西:
7.web页面文件index.jsp中:
需要加入下面几行,才可以在javascript中使用上面部署的类。
<script type='text/javascript' src='/Dictionary/dwr/engine.js'></script>
<script type='text/javascript' src='/Dictionary/dwr/interface/MyTransaction.js'></script>
<script type='text/javascript' src='/Dictionary/dwr/util.js'></script>
注意,里面的src='XXXXXXXX',XXXXXXXX的内容是需要根据自己的工程做修改的。
具体可以点击上图的链接,进去复制
8.还有一个经验性的问题,我做的时候,是做了一个事物层的类Transaction,javascript里使用MyTransaction。不过Transaction的构造函数,是对一个存储结构的类WordDb的实例化,然后我发现,每次我在javascript里用MyTransaction的时候,这个WordDb都会重新实例化,导致存的东西,存进去,就没了。下一次又新实例化一个WordDb,然后往里存,导致每次只有一个数据,自己查还查不到。为了解决这个问题,直接Transaction的构造函数啥事都不干,直接空。然后写一个Init()函数,用于给WordDb的实例化。然后javascript在想要使用的时候,先Init()一下,然后再调用存储和查询函数,完美解决了这个问题。
大致内容就这么多,要具体实现代码的可以留言。