本站消息

站长简介/公众号


站长简介:高级软件工程师,曾在阿里云,每日优鲜从事全栈开发工作,利用周末时间开发出本站,欢迎关注我的微信公众号:程序员总部,程序员的家,探索程序员的人生之路!分享IT最新技术,关注行业最新动向,让你永不落伍。了解同行们的工资,生活工作中的酸甜苦辣,谋求程序员的最终出路!

 价值13000svip视频教程,前端大神匠心打造,零基础前端开发工程师视频教程全套,基础+进阶+项目实战,包含课件和源码

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2021-03(364)

2021-04(182)

2021-05(181)

2021-06(95)

2021-07(12)

springMVC的基础学习

发布于2021-03-13 18:32     阅读(699)     评论(0)     点赞(13)     收藏(4)


M 模型(Model):模型就是数据,就是 dao,bean
V 视图(View):网页, JSP,用来展示模型中的数据
C控制器(controller):把不同的数据(Model),显示在不同的视图(View)上
springMVC框架的作用:接收页面提交的数据、向视图发送数据

springMVC框架的执行流程

springMVC框架的执行流程

  1. 客户访问服务器,DispatcherServlet前端控制器拦截对应的url请求
  2. DispatcherServlet将url转化为uri,交给HandlerMapping处理器映射器处理
  3. HandlerMapping处理器映射器查询Handler映射
  4. HandlerMapping处理器映射器将查询的结果封装为HEC处理器执行器链(包括处理器的地址,对应的拦截器链)对象返回给前端控制器
  5. DispatcherServlet前端控制器调用对应的拦截器去处理,如通过调用HandlerAdapter处理器适配器来处理请求
  6. HandlerAdapter处理器适配器调用对应的Handler处理耐处理请求,再调用Handler的时候会将request携带的数据通过HMC转化
  7. Handler处理对应业务逻辑,最后返回一个ModleAndView对象、MAV里面有返回的数据(Modle)和逻辑视图(View)。最后交给前端控制器
  8. DispatcherServlet前端控制器将MAV交给视图解析器来处理
  9. 视图解析器将视图转化为真正的视图并返回
  10. DispatcherServlet前端控制器将视图进行渲染(将视图和数据合并)
  11. DispatcherServlet前端控制器将渲染后的视图交给用户

配置文件

	<!--扫描Controller注解-->
    <context:component-scan base-package="com.jiale.controller"/>
    <!--配置处理器映射器-->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
    <!--配置处理器映射器-->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
    <!--视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>

解析:
扫描注解:会寻找有@controller注解的类中的的@RequestMapping注解,将方法名的全名称作为一个value,放入到handler映射中
配置处理器映射器和适配器可以省略
视图解析器:将逻辑视图转换为真正的视图,得到真正的视图地址/WEB-INF/XXX.jsp

web.xml文件的配置

	<!--配置前端控制器-->
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--配置读取核心配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

如果不配置springMVC的核心配置文件的地址,就会在WEB-INF文件夹下找前端控制器名称XXXXX-servlet.xml作为配置文件拦截路径

springMVC表单的接收数据和发送数据

后台接收数据

简单的接收数据

handler:

	@RequestMapping("/demo01.do")
    public String demo01(int id,String name,double money,boolean start){
        System.out.println(id);
        System.out.println(name);
        System.out.println(money);
        System.out.println(start);
        //返回逻辑视图
        return "main";
    }

执行后在浏览器中输入http://localhost:8080/springMVCtest/demo01.do?id=2李四&money=90&start=true
若后台输出的是乱码,则我们需要在tomcat的设置中的VM options添加-Dfile.encoding=UTF-8
若控制台乱码,则在help选项上面添加Edit Custom VM Options
在后台会打印数值 2 李四 90.0 true,然后跳转到/WEB-INF/main.jsp上

简单的对象绑定

创建一个User实体类
控制层:

	//测试接收对象作为传递的参数
    @RequestMapping("/demo02.do")
    public String demo02(User user){
        System.out.println(user);
        //返回逻辑视图
        return "main";
    }

后台显示:User{id=2, name=‘李四’, money=90.0, start=true}

接收多选数据

在webapp下面创建一个index01.html文件,文件里面添加多选

	<form action="demo03.do" method="get">
        <input type="checkbox" name="hobby" value="eat"><input type="checkbox" name="hobby" value="drink"><input type="checkbox" name="hobby" value="play"><input type="checkbox" name="hobby" value="enjoy"><br>
        <input type="submit" value="提交">
    </form>

handler:

	//测试多选提交的数据
    @RequestMapping("/demo03.do")
    public String demo03(String hobby){
        System.out.println(hobby);
        //返回逻辑视图
        return "main";
    }

对象的属性是对象

创建一个Dog对象

private User user

控制层:

	//测试前台传递dog和user对象
    @RequestMapping("/demo04.do")
    public String demo04(Dog dog,User user){
        System.out.println(dog);
        System.out.println(user);
        return "main";
    }

在webapp下面创建一个index02.html文件

<form action="demo04.do" method="get">
    狗的id<input type="text" name="id" ><br>
    狗的名称<input type="text" name="dname" ><br>
    狗主人的id<input type="text" name="user.id" ><br>
    狗主人的名称<input type="text" name="user.name" ><br>
    狗主人的身价<input type="text" name="user.money" ><br>
    <br>
    <input type="submit" value="提交">
</form>

对象的属性是list集合或者数组

User类下添加属性:

	private Integer[] array;
    private List<Dog> dogs;

handler同简单对象的绑定

在webapp下面创建一个index03.html文件

<form action="demo02.do" method="get">
        人的id <input type="text" name="id"><br>
        人的名字<input type="text" name="name"><br>
        人的钱<input type="text" name="money"><br>
        人的状态<input type="radio" name="start" value="true">启用
        <input type="radio" name="start" value="false">禁止<br>
        幸运号码:
        <input type="checkbox" name="array" value="1">1
        <input type="checkbox" name="array" value="2">2
        <input type="checkbox" name="array" value="3">3
        人养的狗:<br>
        第一个狗的名称<input type="text" name="dogs[0].dname"><br>
        第二个狗的名称<input type="text" name="dogs[1].dname"><br>
        第三个狗的名称<input type="text" name="dogs[2].dname"><br>
        <br>
        <input type="submit" value="提交">
    </form>

对象的属性是map集合

User类下添加属性:

	private Map<String,Dog> maps;

handler同上:
在webapp下面创建一个index04.html文件

<form action="demo02.do" method="get">
    人的id<input type="text" name="id" ><br>
    人的名称<input type="text" name="name" ><br>
    人的身价<input type="text" name="money" ><br>
    人的状态<input type="radio" name="start" value="true" >启用
    <input type="radio" name="start" value="false" >禁用<br>
    人养的狗:<br>
    第一个狗的名称<input type="text" name="maps['dog1'].dname"><br>
    第二个狗的名称<input type="text" name="maps['小狗狗'].dname"><br>
    第三个狗的名称<input type="text" name="maps['狗儿子'].dname"><br>
    <br>
    <input type="submit" value="提交">
</form>

后台发送数据

使用原servlet的API

要添加javax.servlet-api依赖
handler:

	//数据发送  使用原生态的servletAPI
    @RequestMapping("/demo06.do")
    public String demo06(HttpServletRequest request,HttpServletResponse response, HttpSession session){
        //request域对象放入参数
        request.setAttribute("message","我是request域对象的参数");
        //session中放入参数
        session.setAttribute("session","我是session中的参数");
        //跳转页面
        return "success";
    }

在WEB-INF下面创建一个success.jsp文件

<body>
    <h1>读取后台发送的参数</h1>
    request:${message}<br>
    session:${session}
</body>

使用Map传递参数

在handler入参中添加map 相当于在request域对象中添加参数

	@RequestMapping("/demo06.do")
    public String demo06(Map<String,Object> map){
        //map中放入数据
        map.put("message","我是map中存放的数据")
        return "success";
    }

使用model传递参数

	@RequestMapping("/demo07.do")
    public String demo07(Model model){
        model.addAttribute("message","我是model传递的参数");
        return "success";
    }

使用ModelMap传递参数

	@RequestMapping("/demo08.do")
    public String demo08(ModelMap modelMap){
        modelMap.addAttribute("message","使用model传递的参数");
        modelMap.put("session","使用map的方法传递的数据");
        return "success";
    }

使用ModelAndView传递数据

使用ModelAndView传递数据,是将ModelAndView作为一个返回值使用

	@RequestMapping("/demo09.do")
    public ModelAndView demo09(){
        //创建一个ModelAndView对象
        ModelAndView mav = new ModelAndView();
        //设置逻辑视图
        mav.setViewName("success");
        //放入参数
        mav.addObject("mession","ModelAndView传递的参数");
        //返回结果
        return mav;
    }

springMVC的返回值

字符串作为返回值

用字符串返回作为返回值,返回的就是逻辑视图

return "success";

返回的success会根据视图解析器前缀加后缀,组合为一个真正的视图返回,使用视图解析器将会返回的页面限定在同一目录下,不能出目录,也不能重定向
springMVC在返回的时候view视图支持重定向和转发到其他地方,在返回字符串的时候添加关键字来解决

return "forward:index.jsp";

重定向:

//重定向页码
return "redirect:http://www.baidu.com/s";

返回值是void

可以使用servlet原生态的API来实现转发或者重定向

	@RequestMapping("/demo10.do")
    public void demo10(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
        //转发
        request.getRequestDispatcher("index01.html").forward(request, response);
        //重定向
        response.sendRedirect("http://www.baidu.com");
    }

也可以返回json数据

	@RequestMapping("/demo11.do")
    public void demo11(HttpServletRequest request,HttpServletResponse response) throws IOException {
        //创建一个json数据
        String json = "{\"name\":\"张三\",\"age\"\":12}";
        //将json返回
        response.getWriter().write(json);
    }

返回值是ModelAndView对象
代码同使用ModelAndView传递数据

springMVC常用注解

@RequestMapping

将注解添加在方法上

为该方法提供一个uri的访问路径,可省略前面的/和后缀

@RequestMapping(value = "demo01")

value可添加多个uri地址,两个地址都可以访问到对应的handler

@RequestMapping(value = {"/demo01.do","/demo02.do"})

设置访问权限

//当前的方法只能使用post来访问
@RequestMapping(value = "/demo01.do",method = RequestMethod.POST)

可以添加属性params 来限制访问请求的参数

//限定提交的数据必须有name参数
@RequestMapping(value = "/demo01.do",params="name")

name 必须有name参数
!name 参数中必须不能有name参数
name=zsan 必须有name参数并且参数值必须是zsan
name!=zsan name参数可有可无 但是如果有值不能是zsan

将注解添加在类上

是为当前类下所有的handler的uri添加前缀,为了防止uri的重复

//在类上
//该类下所有的handler的uri前面都添加demo01,访问路径/项目名称/demo/demo01.do
@RequestMapping(value = "/demo")
	//在方法上
	@RequestMapping(value = "/demo01")

ReuqestParam

该注解写在形参列表中的,里面有两个属性常用

	@RequestMapping("/demo02.do")
    //将表单提交的names数据转化为name数据
    public String demo02(@RequestParam(value = "names") String name){
        System.out.println(name);
        return "main";
    }
	@RequestMapping("/demo02.do")
    //如果name没有数据,默认就是张三
    public String demo02(@RequestParam(defaultValue = "张三") String name){
        System.out.println(name);
        return "main";
    }

ResponseBody

如果要使用该注解,必须要额外导入jackson-databind依赖
在handler类上添加注解,就会将返回的对象转化为一个json对象

PathVarable

必须在拦截路径是/的时候来使用,使用rest风格的时候来使用。rest风格传参的时候很多都是将参数放在url路径中
/demo03/add/zsan/22/nan/dalq
使用url传递参数的时候 才使用该注解

	//使用路径传递参数
    @RequestMapping("/add/{name}/{age}/{sex}")
    public String demo(@PathVariable("name") String name,
                       @PathVariable("age") String age,
                       @PathVariable("sex") String sex){
        System.out.println(name);
        System.out.println(age);
        System.out.println(sex);
        return "main/main";
    }

springMVC的常用配置

中文乱码过滤器

为了解决post乱码,springMVC自己做了过滤器,一般使用该过滤器就能解决所有post乱码问题:在web.xml添加配置:

<!--post乱码过滤器-->
<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

静态资源处理

若前端控制器拦截路径是/ 或者/* 会拦截静态资源的(css、js、图片、html网页)都会被拦截,如果需要在springMVC中分开静态资源,必须在核心配置文件中添加一个配置:

<!--静态资源放行-->
<mvc:default-servlet-handler/>

异常处理机制

异常处理机制是指我们在springMVC项目中所有的异常都交给统一的异常处理耐进行项目如果上线了,让用户有更好的体验,一般在项目开发阶段不会使用。
如果要使用需要创建一个统一的异常处理类:

public class MyException implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) {
        //将错误处理分为两个部分
        //可以数据object  发生错误的地方和 exception  对应的异常来决定怎么做
        //不重要的异常   不重要的代码块  可以直接写日志就行
        //比较重要的异常  和代码块   可以发送邮件  提醒运维人员处理
        //紧急的错误  需要立即处理的  可以发短信、电话等等方式通知运维人员
        //在用户看来  为了提升用户体验 可以跳转到一个友好的界面
        ModelAndView mav = new ModelAndView();
        mav.setViewName("main/main");
        mav.addObject("message","不好意思!请重试");
        return mav;
    }
}

核心配置文件中添加:

<!--添加统一异常处理类-->
<bean class="com.offcn.utils.MyException"/>

原文链接:https://blog.csdn.net/ilvjiale/article/details/114639294




所属网站分类: 技术文章 > 博客

作者:大哥你来啦

链接:http://www.qianduanheidong.com/blog/article/35724/a8c495259c4404e09d76/

来源:前端黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

13 0
收藏该文
已收藏

评论内容:(最多支持255个字符)