Spring-mvc

定义

是一个基于MVC架构的开发框架,帮助我们去快速的构建web项目,且支出JSP等其他模板

编写第一个spring-mvc文件

导入架包
在这里插入图片描述
导入spring-mvc.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
"
        >
    <!--引入context组件
        使用IOC的注解扫描与支持 base-package  父路径-->
    <context:component-scan base-package="com.zhongruan.web"/>
    <!-- SpringMvc的扫描与注解支持-->
    <mvc:annotation-driven/>
</beans>

在web.xml文件配置spring-mvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>sevlet1</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>sevlet1</servlet-name>
        <!--针对客户端的请求处理:
            /*: 将所有的客户端请求,都将与@RequestMappering映射地址进行匹配
            /: 将根据后缀名文件直接匹配静态资源。默认无后缀名则匹配映射路径。
            *.do: 根据后缀名直接用于区分映射请求和静态资源的请求。.html/*.xml/*.css
        -->
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
</web-app>

新建loginController类模拟登录
对映射地址进行优化,设置常量

package com.zhongruan.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.DispatcherServlet;

@Controller
@RequestMapping(LoginController.BASE_CONTROLLER)
public class LoginController {

//      优化:字符串常量的提取
    public static final String BASE_CONTROLLER ="/loginController";
    public static final String INDEX_PAGE = "../index.jsp";
    //    模拟登录
    @RequestMapping(value = {"/login"})
    public String login(){

//      1、服务器的处理
        System.out.println("正在登录。。。登录成功");
//      2、页面的响应
        return LoginController.INDEX_PAGE;
    }
}

针对客户端请求,进行参数封装

新建StudentController类
在这里插入图片描述

对基本类型参数传递封装

 @RequestMapping(value = "/getStudentById",method = RequestMethod.GET)
    public String getStudentById(Integer id,String str){
//        服务器处理
        System.out.println("模拟查询 。。。 查询编号为:"+id+"字符串"+str);
//        给出页面响应
        return StudentController.INDEX_PAGE;
    }

对类类型进行参数封装

新建Student类

package com.zhongruan.bean;

import java.util.List;

public class Student {
    private Integer id;
    private String stuName;
    private String age;
    private List<String> subs;
    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", stuName='" + stuName + '\'' +
                ", age='" + age + '\'' +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getStuName() {
        return stuName;
    }

    public void setStuName(String stuName) {
        this.stuName = stuName;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public List<String> getSubs() {
        return subs;
    }

    public void setSubs(List<String> subs) {
        this.subs = subs;
    }

    public Student(Integer id, String stuName, String age) {
        this.id = id;
        this.stuName = stuName;
        this.age = age;
    }

    public Student() {
    }
}


//    模拟新增
//    传参:首先进行student 类对象的创建,在传递对象的属性名即可
    @RequestMapping("/addStu")
    public String addStu(Integer id,Student stu1){
//        服务器的处理
        System.out.println("ID为"+id);
        System.out.println("学生的信息为"+stu1.getId()+stu1.getStuName()+stu1.getAge());
//        页面响应, 没有报404错误
        return INDEX_PAGE;
    }

对数组集合进行参数封装


//    根据ids 进行多查询
//    小结: 数组传递的时候,先构建数组对象在封装参数
//    小结: 一般进行集合参数封装时,是将集合定义到类中,才能识别到集合名称实现封装
    @RequestMapping("/getStuByIds")
    public String getStuByIds(Integer[] ids, Student stu1){
        if (ids!=null) {
            for (Integer id : ids) {
                System.out.println("id为:" + id);
            }
        }
        else {
            System.out.println("ids为空:"+ids);
        }
        System.out.println("得到的集合为:"+stu1.getSubs());
        return INDEX_PAGE;
    }

ServletAPI

// 测试与ServletAPI的成员集成使用
@RequestMapping("/servlet_API")
public String getServletAPI(HttpServletRequest request,
HttpServletResponse response, HttpSession session){

//        String parameter = request.getParameter();

// 只能到String类型

    System.out.println("请求对象为:"+request);
    System.out.println("session对象为:"+request.getSession());
    System.out.println("响应对象为:"+response);
    System.out.println("其他对象为:"+session);
    return INDEX_PAGE;
}

针对客户端的的请求,给出页面响应,数据响应:

5.1:页面响应,为了页面跳转
1.直接借用ServletAPI中的request和response实现转发和重定向

request.getRequestDispatcher("../index.jsp").forward(request,response);
           // 要加上根目录 request.getContextPath()
            response.sendRedirect(request.getContextPath()+"../index.jsp");

2.可以直接转发或者重定向

//方式二: 可以根据字符串实现转发或者重定向
    //        这样不用加根目录
  //          重定向地址会改变
            return "redirect:/index.jsp";
            return "forward:/index.jsp";

3…也可以响应MdelAndView:该对象内部可以封装index.jsp

//方式三: 可以直接响应ModelAndView: 内部维护了页面
            ModelAndView mv = new ModelAndView();
            mv.setViewName("redirect:/index.jsp");
            return mv;

4.也可以响应MdelAndView:该对象内部可以封装index.jsp或者直接响应页面


//            方式四: 可以直接页面字符串的地址 进行响应
            return "index.jsp";
            

小结:二和四是同一种响应方式,如果不指定响应方式,默认是请求转发,也可以指定转发或者重定向
三 是直接将响应的页面地址封装到了 ModelAndView, 也可以去指定请求或者转发

5.2数据响应:为了提供数据到客户端(Ajax请求时)

1.如何去直接响应基本类型,引用类型,集合数据与视图绑定
1.1.可以借助ServletAPI响应

// 1、直接借用ServeletAPI实现模拟数据响应
        request.setAttribute("name1","小明");
       request.getSession().setAttribute("name2","小明2");
       return "../index.jsp";

1.2可以借用ModelAndView直接响应

//2、借用ModelAndView对象实现数据响应
        ModelAndView mv  = new ModelAndView();
        Student s1 = new Student(1,"小明","");
        mv.addObject("s1",s1);
        mv.setViewName("../index.jsp");
        return mv;

1.3可以借用Model和ModelMap组件实现响应
在这里插入图片描述

3、借用Model 和 ModelMap 实现响应: 可以理解为从ModelAndView 拆分过来的
            m.addAttribute("name3","笑花");
            mm.addAttribute("name4","我的错");
            mm.put("name5","下班了");
            return INDEX_PAGE;

1.4可以借用注解:@ModelAttribute实现响应
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.5直接响应数据到response响应对象中,不进行视图响应

主要是用于ajax请求

 5、数据响应:通过返回值直接响应到客户端,无需响应视图
 当请求404无法找到方法时,可能是ajax缺少@RespondseBody
//    406:(Not Acceptable):服务端错误,表示去响应数据的时候,格式无法正常转换,需要导包
    @RequestMapping("/getData2")
    @ResponseBody
    public String getData2(){
//        如果是针对客户端的ajax请求,需要与数据响应
//        1、直接响应字符串,传中文乱码
//        return "阿斯达";

//        2、直接响应引用对象
//        Student student = new Student();
//        student.setId(1);
//        student.setStuName("asd");
//        return student;

//        3、直接响应集合
//        Student s1 = new Student(1,"asd","12");
//        Student s2 = new Student(2,"as","11");
//        Student s3 = new Student(3,"a","10");
//        List list = new ArrayList();
//        list.add(s1);
//        list.add(s2);
//        list.add(s3);
//        return list;

//        3、直接响应JSON字符串
        String strJson ="{\"id\":2,\"stuName\":\"隔壁老沈\",\"age\":\"20\"}";
        return strJson;
    }

在这里插入图片描述
jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <%--发起ajax请求--%>
    <script src="http://code.jquery.com/jquery-2.1.4.min.js" ></script>
    <script type="text/javascript">
        function f1() {
        //    type: 请求方式; dataType 参数类型;
        //    contextType: 请求的正文类型:"application/json;charset=utf-8"
            $.ajax({
                url:'${pageContext.request.contextPath}/studentControllerPage2/getData2.do',
                type:'POST',
                contextType:'application/json;charset=utf-8',
                success:function (a) {
                    // alert('请求成功:'+a);

                //    1、当服务器收到的响应对象为对象时,可以直接对象.属性
                //     alert(a+a.id+a.stuName);

                //    2、当服务器接受到的响应是集合时,需要遍历
                //     $(a).each(function(index,el){
                //         alert('遍历:'+el+el.id+el.stuName+el.age);
                //     })

                //    3、当服务器接收到的是JSON字符串时
                //    直接把字符串转换为JSON对象
                    var parseJSON = $.parseJSON(a);
                    alert("JSON对象:"+parseJSON)

                },
                error:function (a) {
                    alert('请求失败:'+a);
                }
            });
        }
    </script>
</head>
<body>
<h1 onclick="f1()">点击响应</h1>
</body>
</html>

完成

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值