博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring MVC例子
阅读量:4952 次
发布时间:2019-06-12

本文共 5780 字,大约阅读时间需要 19 分钟。

学习Spring MVC的一个例子,参考书籍《Servlet、JSP、Spring MVC学习指南》,简单总结一下。

代码下载:

本文参考链接:

项目目录

这里,没有采用maven来管理依赖,实际项目中可以使用maven方便管理项目,项目依赖的jar包如下所示

 

项目在IDEA中打包、部署到tomcat,可以参考博客:

web.xml配置

springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
/WEB-INF/config/springmvc-config.xml
1
springmvc
/

springmvc-config.xml

Service

@Service注解可以指定名称,当一个接口有多个实现类时,在Controller里面注入时,可以指定实现类

//service加上名称,在一个接口多个实现类时,可以这样区分@Service("productService")public class ProductServiceImpl implements ProductService {    private Map
products = new HashMap
(); private AtomicLong generator = new AtomicLong(); @Override public Product add(Product product) { long newId = generator.incrementAndGet(); product.setId(newId); products.put(newId, product); System.out.println("Add" + product); return product; } @Override public Product get(long id) { return products.get(id); }}

Controller

Controller中使用@Qualifier指定具体的service

1.通过@RequestMapping,进行url与处理方法的映射,处理方法返回的是视图的名称,不需要写绝对路径和jsp后缀,这是因为web.xml中配置了视图解析器

2.处理方法里面参数可以自己定义,其中Model对象有spring生成,可以在model中添加对象,作为request对象,发送给jsp

3.注意转发与重定向的区别,代码编写方式可以参考代码。重定向返回的视图名字前加上"redirect:"

1、转发使用的是getRequestDispatcher()方法;重定向使用的是sendRedirect();

 2、转发:浏览器URL的地址栏不变。重定向:浏览器URL的地址栏改变;

 3、转发是服务器行为,重定向是客户端行为;

 4、转发是浏览器只做了一次访问请求。重定向是浏览器做了至少两次的访问请求;

 5、转发2次跳转之间传输的信息不会丢失,重定向2次跳转之间传输的信息会丢失(request范围)。

转发是要比重定向快,因为重定向需要经过客户端,而转发没有。有时候,采用重定向会更好,若需要重定向到另外一个外部网站,则无法使用转发。另外,重定向还有一个应用场景:避免在用户重新加载页面时两次调用相同的动作。

例如,当提交产品表单的时候,执行保存的方法将会被调用,并执行相应的动作;这在一个真实的应用程序中,很有可能将表单中的所有产品信息加入到数据库中。但是如果在提交表单后,重新加载页面,执行保存的方法就很有可能再次被调用。同样的产品信息就将可能再次被添加,为了避免这种情况,提交表单后,你可以将用户重定向到一个不同的页面,这样的话,这个网页任意重新加载都没有副作用;

       但是,使用重定向不太方便的地方是,使用它无法将值轻松地传递给目标页面。而采用转发,则可以简单地将属性添加到Model,使得目标视图可以轻松访问。由于重定向经过客户端,所以Model中的一切都会在重定向时丢失。但幸运的是,在Spring3.1版本以后,我们可以通过Flash属性,解决重定向时传值丢失的问题。

       要使用Flash属性,必须在Spring MVC的配置文件中添加一个<annotation-driven/>。然后,还必须再方法上添加一个新的参数类型:org.springframework.web.servlet.mvc.support.RedirectAttributes。

4.路径变量的使用,@PathVariable

5.获取请求参数,在处理方法中增加参数,并使用注解@RequestParam

 Controller代码:    

@Controllerpublic class ProductController {    @Autowired    //按照名称,注入指定的接口实现类    @Qualifier("productService")    ProductService productService;    private static final Log logger =            LogFactory.getLog(ProductController.class);    @RequestMapping(value = "/product_input")    public String inputProduct() {        logger.info("inputProduct called");        return "ProductForm";    }    //参数productForm中的字段与提交表当中的text文本框name一一对应    @RequestMapping(value = "/product_save")    public String saveProduct(ProductForm productForm, Model model, RedirectAttributes redirectAttributes){        logger.info("saveProduct called");        Product product = new Product();        product.setName(productForm.getName());        product.setDescription(productForm.getDescription());        try {            product.setPrice(Float.parseFloat(                    productForm.getPrice()));        } catch (NumberFormatException e) {        }        productService.add(product);        //转发        //model里面的内容作为request属性传递给jsp_servlet        //model.addAttribute("product", product);        //return "ProductDetails";        //重定向        // 客户端重新发送请求,Model无效        //通过addFlashAttribute,可以在jsp中引用对象        redirectAttributes.addFlashAttribute(product);        return "redirect:/product_details";    }    @RequestMapping(value = "/product_details")    public String productDetail(){        logger.info("productDetail called");        return "ProductDetails";    }    //路径变量的使用    //http://localhost:8080/app16a/product/1    @RequestMapping(value = "/product/{id}")    public String productGet(@PathVariable Long id,Model model){        Product product = productService.get(id);        model.addAttribute(product);        logger.info("productGet called");        return "ProductDetails";    }    //获取请求参数    //http://localhost:8080/app16a/product?id=1    @RequestMapping(value = "/product")    public String productGetWithParams(@RequestParam Long id,Model model){        Product product = productService.get(id);        model.addAttribute(product);        logger.info("productGetWithParams called");        return "ProductDetails";    }}

视图

PoductForm.jsp:form表单中各个文本输入控件的name作为request请求参数的键,发送给action指定的url

<%@ page contentType="text/html;charset=UTF-8" language="java" %>    Add Product Form
Add a product

ProductDetails.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>    Save Product

The product has been saved.

Details:
<%-- Controller里面的Model中的product对象其实是作为request属性传递给jsp的,所以这里用requestScope来引用--%> Product Name: ${requestScope.product.name}
Description: ${requestScope.product.description}
Price: $${requestScope.product.price}

以上只是对Spring MVC的简单使用

转载于:https://www.cnblogs.com/darange/p/11151497.html

你可能感兴趣的文章
POJ 3349 Snowflake Snow Snowflakes (哈希表)
查看>>
POJ 1988 Cube Stacking
查看>>
POJ 1308 Is It A Tree?(并查集)
查看>>
CCS 3.3 操作C函数读写文件
查看>>
1、第二章中的概念
查看>>
Sql基础
查看>>
JS基础知识梳理---String对象
查看>>
Servlet事件监听器、监听servletContext域对象创建和销毁、监听三个域对象属性变化...
查看>>
N进制到M进制的转换问题
查看>>
JAVA三大特性之一——封装
查看>>
【设计模式】观察者模式
查看>>
登录HSS总是报错:User Session Expired
查看>>
OneProxy学习笔记
查看>>
MySQL的备份与恢复理解与备份策略
查看>>
[置顶] 设计模式之单例模式 (Design patterns of the The singleton pattern)c#
查看>>
汽车品牌图标的tableView展示 代码
查看>>
Android------三种监听OnTouchListener、OnLongClickListener同时实现即其中返回值true或者false的含义...
查看>>
MATLAB实现多元线性回归预测
查看>>
Mac xcode 配置OpenGL
查看>>
利用sed把一行的文本文件改成每句一行
查看>>