部署描述符=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(从哪里取出?怎么取出?)
//取出模型中的属性