.Net转Java自学之路—SpringMVC框架篇二(入门案例)

前端控制器配置,在web.xml中配置前端控制器。

<!-- springmvc前端控制器 -->
<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- contextConfigLocation配置springmvc加载的配置文件(配置处理器映射器、适配器等)
        若不配置contextConfigLocation,则默认加载WEB-INF/servlet名称-servlet.xml(springmvc-servlet.xml) -->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc.xml</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <!-- 第一种:*.action,访问以.action结尾,由DispatcherServlet进行解析
        第二种:/,所有访问的地址都由DispatcherServlet进行解析,对静态文件的解析需要配置不让DispatcherServlet进行解析
            使用此种方式可以实现RESTful风格的url
        第三种:/*,这个配置不对,使用此种配置,最终要转发到一个jsp页面时,
            仍然由DispatcherServlet进行解析jsp页面,不能根据jsp页面找到Handler,会报错 -->
    <url-pattern>*.action</url-pattern>
</servlet-mapping>

配置处理器适配器:在classpath下的springmvc.xml中配置处理器映射器。

<!-- 配置 处理器适配器  所有的处理器适配器都实现HandlerAdapter接口 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
public class GoodsController implements Controller {

    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        // 调用service查找数据库,查询Goods信息列表。
        List<Goods> goodsList=null;

        //返回ModelAndView
        ModelAndView mav=new ModelAndView();
        //相当于request的setAttribute,在jsp中通过goodsList取数据。
        mav.addObject("goodsList", goodsList);
        //指定视图
        mav.setViewName("goodslist.jsp");
        return null;
    }
}

配置Handler:将编写的Handler在spring容器中加载。

<!-- 配置Handler -->
<bean name="/goods.action" class="cn.test.ssm.contruller.GoodsController"/>

  配置处理器映射器:在classpath下的springmvc.xml中配置处理器映射器。

<!-- 配置 处理器映射器
    BeanNameUrlHandlerMapping:将bean的name作为url进行查找,需要在配置Handler时指定beanname(就是url)
    所有的映射器都实现了HandlerMapping接口。-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

非注解的处理器映射器:

  org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter:编写的Handler需要实现Controller接口。

  org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter:编写的Handler需要实现HttpRequestHandler接口。

  配置HttpRequestHandlerAdapter的适配器:

<!-- 配置属于HttpRequestHandlerAdapter的Handler -->
<bean id="httpGoodsController" name="/httpgoods.action" class="cn.test.ssm.contruller.HttpGoodsController"/>

<!-- 另一个适配器:HttpRequestHandlerAdapter配置 -->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>

  将配置的Handler加入url映射配置:

<!-- 另一个映射器:SimpleUrlHandlerMapping映射
    简单的url映射配置 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <!-- prop的value为配置Handler的id值
                对goodsController进行url映射 -->
            <prop key="/goods1.action">goodsController</prop>
            <prop key="/goods2.action">goodsController</prop>
            <!-- 对属于HttpRequestHandlerAdapter适配器的Handler进行url映射 -->
            <prop key="/httpgoods.action">httpGoodsController</prop>
        </props>
    </property>
</bean>
public class HttpGoodsController implements HttpRequestHandler {
    @Override
    public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        List<Goods> goodsList=null;
        request.setAttribute("goodsList", goodsList);
        request.getRequestDispatcher("/goodslist.jsp").forward(request, response);
    }
}

  使用此方法可以通过修改response,设置相应的数据格式。如:相应的Json数据。

response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().wait("Json串");

  在前端控制器从spring-webmvc-5.1.5.RELEASE.jar/org.springframework.web.servlet/DispatcherServlet.properties的文件加载处理器映射器、适配器、视图解析器等组件。若不再springmvc.xml中配置,使用默认加载的。

注解的处理器映射器和适配器:

  在spring3.1之前使用org.springframework.web.servlet.mvc.method.annotation.DefaultAnnotationHandlerMapping注解映射器、org.springframework.web.servlet.mvc.method.annotation.AnnotationMethodHandlerAdapter注解适配器。

  在spring3.1之后使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping注解映射器、org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter注解适配器。

<!-- 配置注解处理器映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!-- 配置注解处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
<!-- 使用mvc:annotation-driven代替上面注解映射器和注解适配器配置
    mvc:annotation-driven默认加载很多的参数绑定方法。
    如:json转换解析器就会默认加载,若使用mvc:annotation-driven不用配置RequestMappingHandlerMapping和RequestMappingHandlerAdapter
    实际开发中使用mvc:annotation-driven -->
<mvc:annotation-driven></mvc:annotation-driven>
//注解的Handler  在使用注解的映射器和适配器时,注解的映射器和适配器必须配对使用。
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.ModelAndView;
/**
 * 使用@Controller标识该类为一个控制器。
 */
@Controller
public class ZJGoodsController {

    /*
     * @RequestMapping实现对方法和url进行映射,一个方法对于一个url
     * 一般建议将url和方法保持一致。后面的action是可选的
     */
    @RequestMapping("/testFun.action")
    public ModelAndView testFun()throws Exception{
        List<Goods> goodsList=null;
        ModelAndView mav=new ModelAndView();
        mav.addObject("goodslist",goodsList);
        mav.setViewName("jsp页面路径");
        return mav;
    }

    @RequestMapping("/query")
    public ModelAndView query()throws Exception{
        List<Goods> goodsList=null;
        ModelAndView mav=new ModelAndView();
        mav.addObject("query",goodsList);
        mav.setViewName("jsp页面路径");
        return mav;
    }
}

  在spring容器中加载Handler:

<!-- 对于注解的Handler可以单独配置 -->
<bean class="cn.test.ssm.contruller.ZJGoodsController"/>
<!-- 注解的Handler单独配置比较繁琐,为方便开发,使用组件扫描来代替。
    可以扫描controller、service等 -->
<context:component-scan base-package="cn.test.ssm.contruller"></context:component-scan>

controller方法返回值:

  ModelAndView:
    返回值为ModelAndView,需要在方法结束时,定义ModelAndView,将model和view分别进行设置。

  String:
    若controller方法返回String。
    1、表示返回逻辑视图名:真正视图(jsp视图) = 前缀 + 逻辑视图名 + 后缀。

@RequestMapping(value="/query",method={RequestMethod.GET,RequestMethod.POST})
public String query(Model model)throws Exception{
    List<Goods> goodsList=null;
    //ModelAndView mav=new ModelAndView();
    //mav.addObject("query",goodsList);
    //mav.setViewName("jsp页面路径");
    //当方法返回值为String时,需要把Model作为形参传递到方法中,通过形参的model将model中数据传递到页面。
    //model.addAttribute相当于ModelAndView.addObject
    model.addAttribute("query",goodsList);
    return "jsp页面路径";
}

    2、redirect重定向:如修改功能完成后,重定向到查询列表页。redirect重定向特点:浏览器地址栏中url会变化。修改提交的request数据无法传到重定向的地址。因为重定向后重新进行request。也就是request无法共享。如:

@RequestMapping("/edit")
public String edit()throws Exception{
    return "redirect:query.action";
}

    3、forward页面转发:通过forward进行页面转发,浏览器地址栏URL不变,request可以共享。

@RequestMapping("/edit")
public String edit()throws Exception{
    return "forward:query.action";
}

  void:

    在controller方法形参中可以定义request和response,使用request和response指定响应结果。

    1、使用request转发页面:request.getRequestDispatcher("页面路径").forward(request,response);

    2、使用response重定向:response.sendRedirect("页面路径");

    3、使用response指定响应结果。如响应JSON数据:

response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("JSON串")

原文地址:https://www.cnblogs.com/zltao/p/10630781.html

时间: 2024-11-06 03:48:12

.Net转Java自学之路—SpringMVC框架篇二(入门案例)的相关文章

.Net转Java自学之路—基础巩固篇二十一(模块化思想)

Java 9 出现的 模块化思想/技术 优点:文件体积缩小,权限体系更精准 module-info.java 模块描述信息文件 module 本模块名称{ exports(导出)  对外暴露的包路径; requires  需要依赖的其他模块名称; } 新建: 右击项目>>Configure>>Create module-info.java>>小写英文模块名称 设置依赖信息 1.再新建的模块文件中写入 requires 模块名称: 2.右击项目>>Build

.Net转Java自学之路—基础巩固篇三十二(JavaMail)

commons-fileupload组件: commons-fileupload.jar commons-io.jar 该组件会解析request中的上传数据,解析后的结果是一个表单项数据封装到一个FileItem对象中,只需调用FileItem中的方法即可. 上传三步:相关类 工厂:DisFileItemFactory 解析器:ServletFileUpload 表单项:FileItem //ServletFileUpload: setFileSizeMax(n*1024);//限制单个文件大

.Net转Java自学之路—基础巩固篇十八(正则)

正则表达式: 正则就是用于操作字符串的规则.其中是以一些符号来标识规则. 字符类: [] :范围 - :连接符 ^ :非 预定义字符类: . :任何字符 \d :数字 \D :非数字 \s :空白字符 \S :非空白字符 \w :单词字符 \W:非单词字符 边界匹配器: ~ :行开头 $ :行结尾 \b :单词边界 组: () 当组进行嵌套时可以通过从左到右来计算其开括号来编号.组0代表的是整个表达式 实例:(.)\\1+ 为了提高规则复用,用()进行封装,每个括号都是一个编号,从1开始 为了复

【转】JAVA自学之路

JAVA自学之路 一: 学会选择 为了就业,不少同学参加各种各样的培训. 决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3G.测试等. 那么究竟应该选择什么方向呢? 我的意见是,不要太过相信各种培训机构或是抢手文章的说法(包括我),当你要走向社会的时候,就不要再把自己当成学生,不要把自己的将来交给别人,学会运用自己的眼睛去观察,去了解这个世界吧. 每个培训机构都会宣传自己的好处,并不能说明大的趋势. 一些新闻文章很有可能是枪手写的,不必太过相信.国外背景的

马士兵:JAVA自学之路

JAVA自学之路 一:学会选择 为了就业,不少同学参加各种各样的培训.决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3G.测试等. 那么究竟应该选择什么方向呢?我的意见是,不要太过相信各种培训机构或是抢手文章的说法(包括我),当你要走向社会的时候,就不要再把自己当成学生,不要把自己的将来交给别人,学会运用自己的眼睛去观察,去了解这个世界吧. 每个培训机构都会宣传自己的好处,并不能说明大的趋势.一些新闻文章很有可能是枪手写的,不必太过相信.国外背景的教师和课

[转载] JAVA自学之路

原文链接http://blog.csdn.net/mengxin846/article/details/2219844 虽然文章有点旧但还是有些启发的,譬如要事第一,好读书不求甚解. JAVA自学之路 一:学会选择 为了就业,不少同学参加各种各样的培训. 决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3G.测试等. 那么究竟应该选择什么方向呢? 我的意见是,不要太过相信各种培训机构或是抢手文章的说法(包括我),当你要走向社会的时候,就不要再把自己当 成学生

Java 自学之路

Java 自学之路 前言 从运行第一个程序开始算起,我接触编程也有三年的时间了.最初是从51单片机入门学习的C语言,班里面的大佬带着我一起做小项目,但是因为没人教,基本靠自学,学得慢,写的代码也烂,很没有章法.后来大三下半学期开始准备考研(从电子跨考计算机),从零开始学习数据结构,这才算是真正地入了编程的门.至于考研,后来就放弃了(别问我为什么放弃,当时脑子抽了),去了一家小公司实习.这家公司主要做机器视觉的项目,当时去面试的时候觉得挺高大上,技术 leader 也挺和蔼,感觉是很务实的一个团队

Java自学之路---DotCom

引言 我从接触编程以来,一直是一个C/C++程序猿,因为我喜欢编程时,那种接地气的感觉,认为只有自己管理内存的使用,心理才踏实.但随着工作中不断增加的见闻,不断的从博客和源码中获得新的见解,我发现这个时代已经发生了变化,我们有强劲的硬件资源.我们有久经考验的框架和源码,我们最宝贵的是花在编码上的时间.所以我决定带着之前C/C++的经验,来认识JAVA是门怎样的语言,以及它的编程理念可以给我带来怎样的好处. 如何学习 和我学习其他语言一样,我主要还是依靠书本,电子书或者是纸质书,这样学习起来才是最

java自学之路-day17

JAVA17 多线程 进程和线程的概念 进程 l  正在运行中的程序 l  程序存储在硬盘中 当进入内存运行时 l  内存中的每一个程序就叫进程 l  并且每一个进程都有一个独立的功能 线程 l  迅雷中的多线程下载 l  main方法中有很多方法一次排列 如果其中一个方法执行了很多次循环 那么下一个方法就不会执行 从入口main到结束,一条路走到底 必须一个一个的执行 这种程序是单线程程序 效率慢 l  例如 多台电脑网吧上网 多条路通行 线程 概念 l  CPU 中央处理器 inter AW