1.问题描述
在java开发的web应用当中我们要经常地用到对数据库的访问,但是在开发当中可能会遇到很多的问题,比如用户输入的字符串不合法,插入数据格式不对,网络连接中断等一系列的问题,java提供了异常处理的机制,这大大的简化了开发人员的代码量,以提供了很好的代码质量和程序的健壮性,在struts中我们开发程序一般要有一些基本的东西,比如说要有struts-conf.xml文件老对程序的流程进行配置,actionForm老保存数据的传递,Action来处理程序业务处理,虽然我们可以在actionForm中来验证请求数据和合法性,但是在后台的程序在运行时我们不知道会有什么意想不到情况的发生,只在actionForm中进行验证时不一定可以杜绝非法情况的发生的 ,我们可以在后台来进行处理,这个时候我们引出了java的映射机制,当然在struts中用到映射机制还不仅仅有助于我们对异常的处理,还在于这样可以提高我们的开发速度,还可以较少action和actionForm的数量,虽然struts也有这方面的类,但我觉得还不够好,还不可以简化我们的工作。同时,在开发有高的安全性的系统的时候,如何保证信息的安全渐渐的成为了开发者的课题,一般的方式是直接用到request对象来传递表但到后台的数据,在struts中使用的actionForml来完成的,但是我们有没有别的方法那,答案是肯定的,那就是xml,下面,我就java的映射机制和xml在Strutszhjong的应用来展开讨论,如有不对的地方敬请斧正.
2.java的映射机制
java是不支持动态语言的,虽然最近传闻sun公司将在下一个jvm中添加动态语言的特性,但是现在我们还没有办法适用,不过还好,因为java中的映射机制可以让我们来完成动态的程序,实事上java的映射机制就是及时地满足了我们开发的需要,也对我们使用动态语言奠定了一定的思维基础.java的映射机制在我们开发中我们是这样的来使用的.我想鉴定一个场景:加入你要为一个教育机构建立一个平台,使用的是java和Struts,在开发当中我们要为每个页面开发action,在action中我们要进行必要的业务,现在我们要开发对学生管理工作,b包括对学生信息的增加,修改和删除,我们要将建立3个action和3个actionForm(后者是一个actionForm),再不然就是建立一个action和一个actionForm,当然我们就要继承DispatchAction,利用DispatchAction开发struts真的是很方便的,我在这里要声明,这个类的确很好用,我并不反对你不使用它,不过在这里我只是找到了一种更好的方法而已。要实现这三个业务我们必定要将牵涉到对数据库的操作,我们不能保证对数据库的操作会不会有异常,常规的方式就是我们在这里直接的捕获异常并返回出错页面,在这里我并不打算这么做,原因就是我认为我推荐的方法是更好的一种方式,要实现我的这个框架我们第一步将是建立一个类,代码如下:
import java.lang.reflect.*;
import java.io.IOException;
import java.util.Properties;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionError;
public class BaseAction extends Action
{ public ActionForward perform(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
String methodName="";
try
{
String actionMethod = request.getParameter("actionMethod"); //客户那里传来的要调用那一个方法
//根据Form的action调用不同的方法。
//获取方法名
methodName = "do" + actionMethod;
//利用反射调用相应方法
Class[] param = {
Class.forName("org.apache.struts.action.ActionMapping"),
Class.forName("org.apache.struts.action.ActionForm"),
Class.forName("javax.servlet.http.HttpServletRequest"),
Class.forName("javax.servlet.http.HttpServletResponse")};
Object[] obj = {mapping, form, request, response};
Method method = this.getClass().getMethod(methodName, param);
ActionForward forward = (ActionForward)method.invoke(this, obj);
saveToken(request);
return forward;
}
catch(NoSuchMethodException ee)
{
request.setAttribute("error",ee);
//来传递异常
return processForwardByException(mapping, ee, request, response);
}
}
}
在我们写每一个action的时候都继承这个类,而在类里边直接的写自己的方法就可以了,同时还可以达到几个jsp页面公用一个action的目的,是不是有点像DispatchAction那,的确非常的类似欧.不过我们发现,在这各类里边我们捕获了异常,这就意味着我们在实现我们方法的时候不用考虑会有什么异常,我们只要抛出就可以了,这就减少和很多的捕获代码,我们可以看到,我们在捕获的异常之后还把它放到了request当中,这样就可以在jsp里直接的得到他了,很方便的给用户提示是什么原因让该操作没有执行成功,是不是很酷。
那么我们再来看看我们为什么要用映射那?
不是很好回答,加入你使用过php的话,你就会明白动态语言的巨大潜力,在php当中根本不需要什么映射,虽然也有这种机制,但是我认为他并不需要,在php中他还有很多的函数和自定义函数,加入我们不知道什么时间要调用那一个函数,或者要调用的函数时表单传来的一个参数,我们可以这样的莱处理,看下面代码片断
<?php
$moth=$_Post("moth");
//我们要调用名字是$moth值得方法,我们只要这么做就可以了
$moth();
?>
假定我们的url是http://127.0.0.1/test.php?moth=Show,那么在程序中将会执行Show()这个方法,这在java总是不可以的,我们只有使用映射的机制,他就是这样在不经意之间给我们很大的自由,我们不需要写一大堆的if或者是switch就可以很轻松的执行我们希望的代码,提高了程序的灵活性,在我们添加了一个新了类后,只要放到web服务器上,我们就会马上看到效果,因为web的缓存当中没有这个类,这样就解决了当我们把新的东西放到web服务器后不能马上反应出来,只有重新启动服务器后者是手动清除缓存才可以的问题。
3 xml在web开发中的应用。
的确,现在xml很流行,webservic的发展更是推动的他的发展,更有一些人断言xml将会取代html,今天我不但算讲究xml在webservic中的发展,而是就一个方面来谈他的价值。
还是我们先假设一个场景:假定有一个银行要做一个系统,无论如何她也不希望用户看到他的后台返回来的原始数据,我们该如何做那,页面和数据分离会是一个好的选择阿,我们这样就可以大胆的使用xml。当然这是由前提的,你必须对xml的解析有了解,不论你是采用dom还是xsl后者是xpath都无所谓,反正就是实现了页面和数据的分离。一般的用户就不可以简单的参看源代码而分析出你返回客户的数据了。
4 总结
java映射机制和xml在web开发中不仅于此,java的映射机制在一些开元的框架重用的十分的多,最出名的spring,struts,hibnater都用到的java的反射机制,可见他的功能给用户很大的自由度,xml在面对数据的封装,格式化,传输体现的优点就更多了,具体可以参考soap方面的书籍来对xml有更深刻的理解
在java开发的web应用当中我们要经常地用到对数据库的访问,但是在开发当中可能会遇到很多的问题,比如用户输入的字符串不合法,插入数据格式不对,网络连接中断等一系列的问题,java提供了异常处理的机制,这大大的简化了开发人员的代码量,以提供了很好的代码质量和程序的健壮性,在struts中我们开发程序一般要有一些基本的东西,比如说要有struts-conf.xml文件老对程序的流程进行配置,actionForm老保存数据的传递,Action来处理程序业务处理,虽然我们可以在actionForm中来验证请求数据和合法性,但是在后台的程序在运行时我们不知道会有什么意想不到情况的发生,只在actionForm中进行验证时不一定可以杜绝非法情况的发生的 ,我们可以在后台来进行处理,这个时候我们引出了java的映射机制,当然在struts中用到映射机制还不仅仅有助于我们对异常的处理,还在于这样可以提高我们的开发速度,还可以较少action和actionForm的数量,虽然struts也有这方面的类,但我觉得还不够好,还不可以简化我们的工作。同时,在开发有高的安全性的系统的时候,如何保证信息的安全渐渐的成为了开发者的课题,一般的方式是直接用到request对象来传递表但到后台的数据,在struts中使用的actionForml来完成的,但是我们有没有别的方法那,答案是肯定的,那就是xml,下面,我就java的映射机制和xml在Strutszhjong的应用来展开讨论,如有不对的地方敬请斧正.
2.java的映射机制
java是不支持动态语言的,虽然最近传闻sun公司将在下一个jvm中添加动态语言的特性,但是现在我们还没有办法适用,不过还好,因为java中的映射机制可以让我们来完成动态的程序,实事上java的映射机制就是及时地满足了我们开发的需要,也对我们使用动态语言奠定了一定的思维基础.java的映射机制在我们开发中我们是这样的来使用的.我想鉴定一个场景:加入你要为一个教育机构建立一个平台,使用的是java和Struts,在开发当中我们要为每个页面开发action,在action中我们要进行必要的业务,现在我们要开发对学生管理工作,b包括对学生信息的增加,修改和删除,我们要将建立3个action和3个actionForm(后者是一个actionForm),再不然就是建立一个action和一个actionForm,当然我们就要继承DispatchAction,利用DispatchAction开发struts真的是很方便的,我在这里要声明,这个类的确很好用,我并不反对你不使用它,不过在这里我只是找到了一种更好的方法而已。要实现这三个业务我们必定要将牵涉到对数据库的操作,我们不能保证对数据库的操作会不会有异常,常规的方式就是我们在这里直接的捕获异常并返回出错页面,在这里我并不打算这么做,原因就是我认为我推荐的方法是更好的一种方式,要实现我的这个框架我们第一步将是建立一个类,代码如下:
import java.lang.reflect.*;
import java.io.IOException;
import java.util.Properties;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionError;
public class BaseAction extends Action
{ public ActionForward perform(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
String methodName="";
try
{
String actionMethod = request.getParameter("actionMethod"); //客户那里传来的要调用那一个方法
//根据Form的action调用不同的方法。
//获取方法名
methodName = "do" + actionMethod;
//利用反射调用相应方法
Class[] param = {
Class.forName("org.apache.struts.action.ActionMapping"),
Class.forName("org.apache.struts.action.ActionForm"),
Class.forName("javax.servlet.http.HttpServletRequest"),
Class.forName("javax.servlet.http.HttpServletResponse")};
Object[] obj = {mapping, form, request, response};
Method method = this.getClass().getMethod(methodName, param);
ActionForward forward = (ActionForward)method.invoke(this, obj);
saveToken(request);
return forward;
}
catch(NoSuchMethodException ee)
{
request.setAttribute("error",ee);
//来传递异常
return processForwardByException(mapping, ee, request, response);
}
}
}
在我们写每一个action的时候都继承这个类,而在类里边直接的写自己的方法就可以了,同时还可以达到几个jsp页面公用一个action的目的,是不是有点像DispatchAction那,的确非常的类似欧.不过我们发现,在这各类里边我们捕获了异常,这就意味着我们在实现我们方法的时候不用考虑会有什么异常,我们只要抛出就可以了,这就减少和很多的捕获代码,我们可以看到,我们在捕获的异常之后还把它放到了request当中,这样就可以在jsp里直接的得到他了,很方便的给用户提示是什么原因让该操作没有执行成功,是不是很酷。
那么我们再来看看我们为什么要用映射那?
不是很好回答,加入你使用过php的话,你就会明白动态语言的巨大潜力,在php当中根本不需要什么映射,虽然也有这种机制,但是我认为他并不需要,在php中他还有很多的函数和自定义函数,加入我们不知道什么时间要调用那一个函数,或者要调用的函数时表单传来的一个参数,我们可以这样的莱处理,看下面代码片断
<?php
$moth=$_Post("moth");
//我们要调用名字是$moth值得方法,我们只要这么做就可以了
$moth();
?>
假定我们的url是http://127.0.0.1/test.php?moth=Show,那么在程序中将会执行Show()这个方法,这在java总是不可以的,我们只有使用映射的机制,他就是这样在不经意之间给我们很大的自由,我们不需要写一大堆的if或者是switch就可以很轻松的执行我们希望的代码,提高了程序的灵活性,在我们添加了一个新了类后,只要放到web服务器上,我们就会马上看到效果,因为web的缓存当中没有这个类,这样就解决了当我们把新的东西放到web服务器后不能马上反应出来,只有重新启动服务器后者是手动清除缓存才可以的问题。
3 xml在web开发中的应用。
的确,现在xml很流行,webservic的发展更是推动的他的发展,更有一些人断言xml将会取代html,今天我不但算讲究xml在webservic中的发展,而是就一个方面来谈他的价值。
还是我们先假设一个场景:假定有一个银行要做一个系统,无论如何她也不希望用户看到他的后台返回来的原始数据,我们该如何做那,页面和数据分离会是一个好的选择阿,我们这样就可以大胆的使用xml。当然这是由前提的,你必须对xml的解析有了解,不论你是采用dom还是xsl后者是xpath都无所谓,反正就是实现了页面和数据的分离。一般的用户就不可以简单的参看源代码而分析出你返回客户的数据了。
4 总结
java映射机制和xml在web开发中不仅于此,java的映射机制在一些开元的框架重用的十分的多,最出名的spring,struts,hibnater都用到的java的反射机制,可见他的功能给用户很大的自由度,xml在面对数据的封装,格式化,传输体现的优点就更多了,具体可以参考soap方面的书籍来对xml有更深刻的理解