SpringMVC入门指南:部署描述符(Web.xml)详解

部署描述符=web.xml
谁的部署描述符?SpringMVC
特征:<web-app>
<?xml version="" encoding=""?>
<web-app version="3.0"
         xmlns="" xmlns:xsi="" xsi:schemaLocation="">
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
        //在这里,程序启动时就会初始化DispatcherServlet->springmvc
        //而要初始化就必须默认加载WEB-INF下的springmvc-servlet.xml配置文件
        //通常并不写出,因为是默认加载的
        //很多人把这个文件称为springMVC配置文件
    </servlet>
    
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!--map all requests to the DispatcherServlet-->
        <url-pattern></url-pattern>
        //在这里所有请求都将交由DispatcherServlet
        //一旦接受到一个请求,就初始化一个request和response
    </servlet-mapping>  
    
</web-app>


接下来就要去写SpringMVC的配置文件了

springmvc-servlet.xml:
这个文件是和上面那个文件同生共存的
做的是初始化的工作
所以特征是:<beans>标签

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="" xmlns:xsi="" xsi:schemLocation="">
    <bean name="/product_input.action"
          class="app03a.controller.InputProductController"/>
    //该标签执行后会实例化InputProductController类
    //对于一个Controller最重要的就是访问路由(path)
    //这里的name就是指定访问的路由是/product_input.action
    <bean name="/product_save.action"
          class="app03a.controller.SaveProductController"/>
    //该标签执行后会实例化aveProductController
    //对于一个Controller最重要的就是访问路由(path)
    //这里的name就是指定访问的路由是/product_input.action
    //这里就表示一旦接收到符合上面的请求就
    //初始化相应的Controller进行处理
    //这里结合前面的部署描述符
    //来走一遍过程:
      1.假定一个请求是/product_input.action
      2.这个请求会被DispatcherServlet也就是springmvc拦截下来
      3.初始化一个resquest和response
      4.然后执行这个springMVC配置文件
      5.根据请求的路由实例化相应的Controller对请求作出处理
</beans>

为了看到完整的过程:
下面看下Controler
这里都是接口的Controller不是注解的Controler
弊端自然就是:一个实现类处理一个请求!!

//要想真正的理解一篇文章到底是怎么回事,必须对作者的背景有所了解
//通过文字要问自己一句:这作者是干嘛的?

先看第一个Controler:InputProductController:

public class InputProductController implements Controller{
    然后再忽略这行代码
    private static final Log logger = LogFactory.getLog(InputProductController.class);
    
    @Override
    //按照上面的分析,
    //接受到请求/product_input.action后
    //将会自动执行handleRequest(rq,rs)方法
    //在这个方法里发生了什么呢?
    //还能发生什么呢?无非就是执行了另一个方法 ModelAndView(viewpath)
    //根据HTTP协议,应该发生了这些事情:
    //根据路径把对应的视图文件读取出来,然后存储起来
    //然后,将这个视图再读入到response中
    //最后返回给客户端,由客户端对视图进行渲染我们看到了一个表单
    public ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse response) throws Exception{
       //先忽略这行代码(这行代码明显是语义调试代码而已)
       logger.info("InputProductController called");
  
       return new ModelAndView("/WEB-INF/jsp/ProductForm.jsp");

       //总结:这里返回的ModelAndView只有视图没有数据,只有舞台没有演员
    }
    

}

再看第二个Controller:SaveProductController类

public class SaveProductController implements Controller{  
    //这行也就跟着忽略了
    private static final Log logger = LogFactory.getLog(SaveProductConroller.class);
    
    @Override
    //根据前面的分析,
    //如果前端发送请求:/product_save.action
    //这个请求首先会被DispatchServlet拦截
    //拦截拦截之后,初始话一个request和response
    //request用来存放请求数据
    //接下来根据请求路由,初始化相应的Controller类
    //然后调用处理该请求的action:handleRequest(rq,rs)
    public ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse response)throws Exception{
          //忽略此行 
          logger.info("SaveProductController called");
          //这里把前端手机的表单的数据取出来放到对象ProductForm中保存起来
          //自然定义的对象类的属性要和表单数据一一对应喽
          ProductForm productForm = new ProductForm();
   
          productForm.setName(request.getParameter("name"));

          productForm.setDescription(request.getParameter("description"));

          productForm.setPrice(request.getParameter("price");

          //create model
          //感觉你好像绕了圈子了
          //但其实没有
          //接下来呢,我们要做的事情是:
            把收集到数据,返回给客户端,让用户看一下
          //再搞个产品对象,把产品名称和产品价格的数据放到对象的属性中:
          Product product = new Product();
          
          product.setName(productForm.getName());
          
          product.setDescription(productForm.getDescription());
          
          try{

              product.setPrice(Float.parseFloat(productForm.getPrice())); 

          }catch(NumberFormatException e){

          }
          //得到了这数据模型product之后,就要卡开始我们的演出了
          //首先,根据视图路径读取视图文件放入response中
          //将模型命名之后,也放入response中
          //然后将response返回给客户端如下:
          return new ModelAndView("/WEB-INF/jsp/ProductDetails.jsp","product",product);
          //客户端接受到响应之后,先渲染出视图,在用特殊的方式解析出数据
          最终就能看到结果了
          //既然说到了这里,那么一个让用户填写的表单的jsp和让用户看一下的jsp是什么样子呢?
          //请往下看:
    }
}


先看表单填写的jsp

     <form action="product_save.action" method="post">
         <fieldset>
               <label for="name">产品名称:</label>
               <input type="text" id="name" name="name" value="" tabindex="1"/>
               <label for="description">产品描述:</label>
               <input type="text" id="description" name="name" value="" tabindex="1"/>
               <label for="price">产品价格:</label>
               <input type="text" id="price" name="name" value="" tabindex="1"/>
               <div id="buttons">
                    <input id="reset" type="reset" tabindex="4">
                    <input id="submit" type="sbumit" tabindex="5" value="添加商品">
               </div>
         </fieldset>
     </form>

再来看一下展示的jsp:

      <p>
           <h5>Details</h5>
           产品名称:${prodcut.name}<br/>
           产品价格:${prodcut.price}<br/>
           
      </p>

//这里返回的对象是有模型的
//ModelAndView中既有Model又有View 视图是用来展示模型的,而模型要提供给对应的视图
//取出模型对象product(从哪里取出?怎么取出?)
//取出模型中的属性

猜你喜欢

转载自blog.csdn.net/weixin_42204641/article/details/81567280