dwrstruts实例开发

xiaoxiao2026-04-13  6

先讲一下应用的结构页面端:    demo.jsp用来展示界面服务端:    DemoAction是Struts中的Action子类负责控制转换,    DemoFacade是业务类负责业务处理。    Goods是一个业务实体类Struts部分的配置就忽略不说了,实际上这个应用并没有包含Struts的配置主要讲一下dwr的配置,首先需要在web.xml增加下面的servelt映射:  <servlet>    <servlet-name>dwr-invoker</servlet-name>    <display-name>DWR Servlet</display-name>    <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>    <init-param>      <param-name>debug</param-name>      <param-value>true</param-value>    </init-param>  </servlet>  <servlet-mapping>    <servlet-name>dwr-invoker</servlet-name>    <url-pattern>/dwr/*</url-pattern>  </servlet-mapping>如上uk.ltd.getahead.dwr.DWRServlet是dwr的核心,用来处理javascript的对远程方法的调用,还有其他参数请参考相关文档。然后,需要在dwr.xml配置相应的远程方法(与具体需要在客户端调用的方法相关),如下为演示应用的配置:<dwr>    <allow>        <convert converter="bean" match="dwr.demo.Goods"/>        <create creator="new" javascript="DemoAction" class="dwr.demo.DemoAction">            <include method="query4dwr"/>            <include method="copy4dwr"/>            <include method="paste4dwr"/>        </create>        <create creator="new" javascript="DemoFacade" class="dwr.demo.DemoFacade">            <include method="queryList"/>            <include method="restore"/>            <include method="del"/>        </create>      </allow></dwr>如上有一个转换器(converter)是用来映射dwr.demo.Goods为bean类型,其他转换器类型请参考相关文档;还有两个创建器分别创建javascript中的DemoAction类和DemoFacade类,分别对应dwr.demo.DemoAction类和dwr.demo.DemoFacade,其中定义的方法就可以从javascript中直接调用了。最后,我们需要在页面中包含相应的javascript:  <script src="/oblog312/dwr/interface/DemoAction.js"></script>  <script src="/oblog312/dwr/interface/DemoFacade.js"></script>  <script src="/oblog312/dwr/engine.js"></script>  <script src="/oblog312/dwr/util.js"></script>如上,dwr/interface/DemoAction.js和dwr/interface/DemoFacade.js是dwr自动生成的javascript文件,包含相应的类及方法,dwr/engine.js是dwr的核心引擎脚本处理客户端调用的转换,dwr/util.js包含了工具函数简化页面处理。下面以查询为例,看一下dwr的具体使用:DemoAction:    public List query4dwr(int type, boolean needClear, HttpServletRequest request) {        if (needClear) request.getSession().removeAttribute("dwr.demo.goodsId");        return demoFacade.queryList(type);    }demo.jsp:  function updateResults() {    DWRUtil.removeAllRows("goodsbody");    var type = document.getElementById("type").value;    DemoAction.query4dwr(type, true, fillTable);  }  function fillTable(goods) {    document.forms[0].select.checked = false;    document.getElementById("totalRecords").innerHTML = goods.length;    DWRUtil.addRows("goodsbody", goods, [ addCheckbox, getName, getPrice, getCount]);  }如上,DemoAction.query4dwr(type, true, fillTable)就可以直接调用DemoAction的方法了,这里fillTable是函数,dwr通过回调函数的方式来进行后续处理。比较一下javascript和action中的方法参数,HttpServletRequest是可以不传的,dwr会自动加上,另一个就是回调参数放在最后,这是比较好的方式,其他方式请参考文档。最后看一下,dwr如何与Struts集成,如下代码:    public ActionForward query(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {        String type = request.getParameter("type");        //或者从form中取值                List goodsList = query4dwr(Integer.parseInt(type), true, request);        request.setAttribute("goodsList", goodsList);                return mapping.findForward("success");    }    public List query4dwr(int type, boolean needClear, HttpServletRequest request) {        if (needClear) request.getSession().removeAttribute("dwr.demo.goodsId");        return demoFacade.queryList(type);    }前一个方法是Struts的方式,但dwr不支持,因此要重构一下在下面的方法才可以被dwr调用。实际上,只有在方法中需要使用到HttpServletRequest是才需要重构方法,如果不使用HttpServletRequest,我们就可以直接调用业务层的类的方法,这样即简单又方便,如下:demo.jsp:  function restore() {    DemoFacade.restore(updateResults);  }DemoAction:    public synchronized void restore() {        goodsList.clear();            initGoods();    }

Struts2.3.1 中整合DWR3.0 实现文件上传

Struts2.3.1 中整合DWR3.0 实现文件上传  

步骤1:导入     dwr*.jar ,           struts2-dwr-plugin-2.3.1.jar         步骤2:在web.xml中引入dwr的配置 <servlet>     <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>  </servlet>    <servlet-mapping>    <servlet-name>dwr-invoker</servlet-name>    <url-pattern>/dwr/*</url-pattern>  </servlet-mapping>    注意需要修改原来配置好的 struts2 原<url-pattern>/*</url-pattern> 为<url-pattern>*.do</url-pattern> 表示struts2只负责处理 .do  结尾的请求    步骤3:在web.xml同级目录中定义一个dwr.xml 配置文件, (dwr.xml可以去dwr.jar包中获得) dwr.xml配置如下: <dwr> <allow>    creator="new" :表示每一次dwr请求但是创建一个新的实例     javascript="DWRService" 表示页面通过什么名字来对应调用你的java类提供服务   <create creator="new"  javascript="DWRService">     指定为前台提供服务的java类   这里的DWRDemo类在页面使用的时候使用DWRService调用   java类就是一个普通的java类   <param name="class" value="org.fd.dwr.DWRDemo"></param>     </create> </allow></dwr>

  步骤4:    必须引入依赖的js文件一般有2个    ajax 核心引擎   <script type='text/javascript' src='/dwr/engine.js'></script>   对应  在步骤3:中定义的  javascript="DWRService"  关联的java类    <script type='text/javascript' src='/dwr/interface/DWRService.js'></script>  可选引入依赖    提供一些方便的工具方法的使用    <script type='text/javascript' src='/dwr/util.js'></script>

步骤5:    使用    DWRService.sayHello(参数    , 如果有返回,回调方法 )

 

代码如下:html代码

 <script type='text/javascript' src='/dwr/engine.js'></script>  <script type='text/javascript' src='/dwr/util.js'></script>  <script type='text/javascript' src='/dwr/interface/DWRService.js'></script>

<script language="JavaScript">  //dwr文件上传 var up = function(){   var headf = dwr.util.getValue("headfile");   DWRService.headUp(headf,  function(flag){    if(flag){     alert("成功");    }else{     alert("不成功");    }   }); } </script></head><body>   <img  src="images/angel.jpg" id="headimage">   <input type="file" name="headfile" id="headfile">   用户名:<input type="text" name="name" id="name" οnblur="up()">   <input type="button" value="上传头像" οnclick="up()"/></body></html>

 

dwr.xml 配置

<dwr> <allow>  <create creator="new"  javascript="DWRService">   <param name="class" value="org.fk.dwr.DWRDemo"></param>  </create> </allow></dwr>

 

java代码如下:

 

import java.io.File;import org.apache.commons.io.FileUtils;import org.directwebremoting.WebContext;import org.directwebremoting.WebContextFactory;import org.directwebremoting.io.FileTransfer;

public class DWRDemo {   public String sayHello(String name){    System.out.println("欢迎您:"+name);    return "欢迎您:"+name;   }      /**    * dwr 文件上传    * @param ft  FileTransfer 封装类前台js提交的文件数据    * @return    */   public boolean headUp(FileTransfer ft){

    WebContext  wc = WebContextFactory.get();    //获得应用路径    String headImages = wc.getSession().getServletContext().getRealPath("/headImages");

    File file = new File(headImages);    //如果文件夹不存在,就创建    if( !file.exists()){     file.mkdirs();    }    try{     //文件上传核心代码使用 commons-io-2.0.1.jar完成     FileUtils.copyInputStreamToFile(ft.getInputStream(), new File(headImages+File.separator+ft.getFilename()));     return true;     }catch(Exception e){     e.printStackTrace();    }    return false;   }}

如果需要项目代码请联系我!

小结  dwr封装了ajax中与服务端交互的模块,通过直接调用服务端类的方法简化了客户端与服务端的交互。虽然说还缺省类似tag这样的组件,但已经很大程度简化了ajax的开发。

 

转载请注明原文地址: https://www.6miu.com/read-5047304.html

最新回复(0)