小菜鸟的Struts MVC和Java反射机制等知识的学习总结

来源:互联网 发布:知迷途其未远 编辑:程序博客网 时间:2024/06/15 13:56

最近学习Struts MVC,做了一些东西,明白了struts为什么是那样的结构,小菜鸟一个,以下是我自己几点浅浅的理解:

    

 struts的结构,视图,模型,控制,三个部分:

 

1.在用户请求的*.jsp里面没有出现任何的处理代码,页面设计和后台的处理工作分开,提高了各自的工作效率。

2.控制部分,是一个总的控制台,只是接受了所有用户请求的页面,然后把它交给对应的action来处理

3.控制中心是怎么找到对应的action的呢,当提交一个请求程序就知道该去往哪里,具有一定的"智能",控制它的结构里面有一个关于所有的action的XML,XML文件包含了所有的action的信息,action要处理哪一个页面,页面从哪里的,页面里面用户填写的信息数据又该存到哪里去,还有处理完以后需要转向哪里去,里面的信息,在struts-config-xml文件里面都有,而这个文件在web.xml里面又有说明了,它应当被解析的,struts开发环境帮助做了这些工作。

4.action处理结果返回给了控制台,然后控制台要把结果返回给相应的用户,这个控制台不做任何页面里面的数据处理工作。

5.模型部分完成所有用户的请求的页面的数据处理。

 

 

最近编程做的一个东西没有使用struts的开发环境,不完全采用struts结构


编程环境:MyEclipse +tomcat    新建web project

 

 

关于其中的知识点总结:

 

1.关于Java反射

Java反射机制,既然是反射,顾名思义,就是像一面镜子让你能够通过它看到你原来所使用的类;

它的用途:用于获取有关的类的信息,类的变量成员,名字,变量的数据类型,修饰类型,方法成员,方法名字,方法的参数,返回值类型,

可以构造反射的类的对象,可以执行一个类的方法等。

 

在我的工程里面用到了Java反射的几个最常用的接口:

Class cls = Class.forname("classname";);                                    //取得了要反射的类

ObjectClass objectClass = (ObjectClass )cls.newInstance();                 //等价于objectClass = new clssname();

Method method[] = cls.getDeclaredMethod();                           //获取这个类的所有的方法

Class pvec[] = method[0].getParamenterType();                               //获取这个类的参数类型

Object arglist[] = new Object[n];                    //新建一个object的数组,用于存放你要传入的参数的值;

arglist[0] = new parametertype("你要传入的参数值");           //把待传入的参数值存入数组;

Object retobj =  method.invoke(ObjectClass ,arglist);   //method.invoke(object,object[]);

                                                                                                          这里是执行了一个new clssname()对象的方法;

resultname = (填写方法返回值的类型)retobj;                   //得到执行了的方法的返回值;

 

 

 

2.关于Java中的继承和多态问题

 

(1)关于继承的问题 

注意上面的Java的反射中,有一个问题,

ObjectClass objectClass = (ObjectClass )cls.newInstance();                 //等价于objectClass = new clssname();

等价于 ObjectClass objectClass  = new clssname();在这里按照我们一般的定义一个类的对象的方法,应当是以下的定义:

ClassName classname =  new clssname();上面的这种定义方法,就包含了Java继承的机制,

ObjectClass 与ClassName 这两个类之间存在着一种关系,(可以理解,在我们所写的程序里面,各个类不是孤立存在的,它们之间存在的联系,被包含,被调用,组合,继承等,这些关系的共同作用,这一点是关于Java的代码复用,实现了我们程序的功能,然而得到了他们之间的关系,在实际操作中又是如何使用它们的,这个我自己的理解,用接口来解决这个问题。)这一点与c++里面函数之间的继承性是相通的。

 

 

在我的程序里,是这样使用的,

public class AbstractAction{                       //action的基类

        public  String process(HttpServletRequest request,HttpServletResponse response,String beanname){
          return null;
}

}

public class Action extends AbstractAction{     //action类
               public  String process(HttpServletRequest request,HttpServletResponse response,String beanname){      

            return "display";
}

}

     在action中的extends是在声明“新类与旧类,基类相似”,新类Action 会自动获得AbstractAction中所有的域和方法。

在这个地方,Action 的对象也是一种AbstractAction对象,如何理解,继承重点强调的是新类与基类之间的关系,新类是现有类的一种类型,所以Action的对象也是一种类型的AbstractAction,

 

通俗的举例:

public class anamal{};

public class  panda extends anamal{};

定义:

animal a = new anamal();基类是动物;

panda  b = new panda(();定义了一个熊猫对象;b是该对象的引用;

animal c = b定义了一个熊猫的对象,

                     但是说明了熊猫也是属于动物;在此有一个很重要的概念,“向上转型”panda的引用b转换成了animal 的引用c

 

所以有此,不难理解为什么上面的ObjectClass objectClass = (ObjectClass )cls.newInstance(); 

cls.newInstance()是定义了一个新类的对象,在此“向上转型”成了基类的对象 

 

写到此,不难明白,在1关于Java反射 里面,Object  arglist[0] = new parametertype("你要传入的参数值"); 

假设parametertype是String类型,Object  arglist[0] = new String("你要传入的参数值"); 前面为什么写的是Object,object是String类的标准根类,也即基类,所以这个地方用了一个object的引用。

 

(2)Java中的多态问题

 在我的程序里面,有一段关于所有的action解析,

public class ActionReflect {

 public   String reflect(HttpServletRequest request,HttpServletResponse response ,String actionurl,String beanname){
   String resultname = null;
   AbstractAction abstractaction = null;
try{

Class cls= Class.forName(actionurl);
    abstractaction =(AbstractAction) cls.newInstance();
    resultname = abstractaction.process(request, response, beanname);
    System.out.println(resultname);

}catch (Throwable e) {
   e.printStackTrace();}
  return resultname;}

基于上面的继承问题,会发现,在这里abstractaction.process(request, response, beanname);新类Action 和基类AbstractAction都有一个方法process(),基于上面继承中,不难理解,这个地方实质上执行的是Action的一个对象的process(),
而其中的机制则是,引入绑定的概念,所谓绑定,其实质是将一个方法调用与一个方法的主题关联起来叫做绑定,该方法是什么,是哪个主体在调用这个方法,这个方法的执行体是什么,编译器并不知道它传入的对象类型,但是绑定机制则在对象里面隐藏了对象的数据类型,那么编译器在执行时得到这个这个对象的类型,它的方法。

Java的这种机制解决了基于同一个基类的所有的继承新类,它们的各自不同的行为和特征,在执行的时候所有方法执行代码编写都是调用了基类的引用。

 

 

3.关于Java的webproject中的web.xml中servletmapping和*.jsp中表单填写的<form action=..>中action的问题

做网页以来的时间,我一直没用弄明白一个问题,

<servlet-mapping>

<servlet-name>Test</servlet-name>   //声明了一个servlet
    <url-pattern>*.do</url-pattern>      //为servlet配置了很多个路径
  </servlet-mapping>

将servlet的声明映射到URL--*.do,当用户请求页面时,就会调用Test这个servlet,在这里一个servlet-Test对应了很多个路径,定义了很多条路是通向这个目的地。

关于页面*.jsp里面的表单,这些表单,例如:

<body>
   <form action="action.do" method="post">
   <table border="10" width="2%" align="left">
   <tr>........

form表单的第一个属性action,这个地方填写的是action.do,所有的表单都是提交给servlet的,注意上面的servlet的映射URL-*.do,

这里我的理解是,为提交的页面分配一条路,action指明了这条路,页面应该提交给谁,

当我们输入网址Http://localhost:8080/../index.jsp,tomcat内部查找了表单里面的action,把它抛到这个action,然后找到了证servlet

 

 

原创粉丝点击