J2EE-020 Spring(五) Spring-MVC(上)

J2EE-020 Spring(五) Spring-MVC(上)

Spring-MVC

1.创建mvc项目步骤

1.引入Spring-mvc,Jar包

`   <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>5.2.5.RELEASE</version>
</dependency>`

2.在web.xml中配置servlet

<servlet>
        <servlet-name>springMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--要求DispatcherServlet实例和Web服务器同时实例化-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <!--里面设置值越大执行优先级越高-->
        <load-on-startup>0</load-on-startup>
    </servlet>
    <!--配置Servlet-->
    <servlet-mapping>
        <servlet-name>springMVC</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

因为servlet是方法后才走init方法初始化,spring-mvc要提前加载Bean文件需要设置和Web服务器同时实例化,其中 contextConfigLocation是固定搭配,加载Bean classpath:spring-configuration的配置文件名加载Bean,0为设置优先级

3.在spring-mvc.xml中配置通过扫描包的方式加载Bean

<context:component-scan base-package="包路径"></context:component-scan>`

4.将实体类加入Bean

在实体类中标注注解@Controller让包加载到Bean,@RequestMapping(“访问路径”)设置在方法。

回顾知识点,servlet的访问路径配置,注解形式@webservlet(name=“类名称”,urlPatterns =“路径”)

@Controller
public class TestController {
    public TestController(){
        System.out.println("sss");
    }
    @RequestMapping("/hello")
    public String doindex(){
      return "index";
    }
}

4.配置视图解析器

这里发现这里实际访问路径为/WEB-INF/views/XX.jsp,
通过配置视图解析器简化代码

<bean id="viewresolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="WEB-INF/views/"></property>
        <property name="suffix" value=".jsp"></property>
</bean>

其中prefix为前部路径,suffix为后半截路径

5.测试成功

J2EE-020 Spring(五) Spring-MVC(上)

2.静态资源放行(二种)

引出问题:之前servlet的老问题了,就是我们所有请求都进行了拦截进入Baseservlet那么js,css,image文件是肯定进入不了代码找不到对应的路径,因此我们需要对一些静态资源进行放行,再BaseServlet中我们解决的办法是通过请求的后缀和固定请求放行(指不需要权限认证的login,Verification Code)

1.第一种(mvc自定义标签放行)

1.开启自定义配置文件

再在bean文件中配置<mvc:annotation-driven></mvc:annotation-driven>

2.定义需要放行的静态资源路径

配置需要放行的路径 <mvc:resources mapping="/static/js/**" location="/static/css/"/>mapping是路径下的什么文件,这个意思static/js下面的所有文件,loaction表示加载路径

<mvc:resources mapping="/static/js/**" location="/static/css/"/>
    <mvc:resources mapping="/static/css/**" location="/static/css/"></mvc:resources>
    <mvc:resources mapping="/static/image/**" location="/static/image/"></mvc:resources>

3.测试

J2EE-020 Spring(五) Spring-MVC(上)

2.第二种(自动放行所有静态资源)

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

在bean配置文件中配置<mvc:default-servlet-handler/>会自动放行所有的静态资源 ,
配置使用自定义mvc标签<mvc:annotation-driven></mvc:annotation-driven>

测试

成功J2EE-020 Spring(五) Spring-MVC(上)

3.SpringMVC常用API

@Conttroller

@Conttroller,标注在类上高速MVC这个是一个控制器
J2EE-020 Spring(五) Spring-MVC(上)

@RequestMapping

标注在类代表父路径,标注在方法表示子路径
注意,在视图解析器InternalResourceView中的前部份方法prefix中一定要以/开头,不如标注在RequestMapping上的方法会变为根目录

错误示范J2EE-020 Spring(五) Spring-MVC(上)J2EE-020 Spring(五) Spring-MVC(上)
正确示范
J2EE-020 Spring(五) Spring-MVC(上)

@RequestParams(“请求参数的名称”)

用于将请参数区数据映射到功能方法上
代码实现

 @RequestMapping("/hello1")
    public ModelAndView doindex(@RequestParam("msg")String msg){
        ModelAndView mv = new ModelAndView();
        mv.setViewName("index");
        mv.addObject("msg",msg);
        return mv;
    }

返回一个ModelAndView,setViewName表示返回的视图名称,addObject为添加参数
前端用JSP调用获得的MSG参数为:${msg}
测试J2EE-020 Spring(五) Spring-MVC(上)

@ResponseBody()和@RequestBody()

@ResponseBody()作用是将返回对象JSON格式返回给前端
@RequestBody()把前端的请求JSON转为对应的实体对象

1.引入jackjson-databind

因为spring-mvc是用的jackjson里的json,所以引入jackjson,注意这里一定要引用2.9版本以上的<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.8</version> </dependency>

2.编码

 @RequestMapping(value = "/userJson",method = RequestMethod.POST)
    @ResponseBody
    public User json(@RequestBody(required = false)  User user) {
        return user;
    }

RequestMapping类型默认是GET设置method = RequestMethod.POST为POST

测试

用Talend API进行测试J2EE-020 Spring(五) Spring-MVC(上)

@RestController

让整个类返回对象都以JSON格式返回
J2EE-020 Spring(五) Spring-MVC(上)

@PathVarible

Rest风格URL请求,比如请求System/{nothing}/{default}
在请求参数标注就可以拿值
编码

`@GetMapping("/system/{name}/{math}")
    public String rest(@PathVariable("name") String name,@PathVariable("math") String math){
        return "name="+name+"math="+math;
}`

测试

J2EE-020 Spring(五) Spring-MVC(上)

参数绑定

基础参数(属性,对象)

简单类型

<form action="receiveString" method="post">
    <input name="username" value="张三" type="text"/>
    <input type="submit" value="提交">
</form>
@RequestMapping("/receiveString")
public void receiveString(String username){
   System.out.println(username); 
}

包装类类型

//定义类型
public class Subject{
   private  User user;
}
public class User {
   private  String name;
   private Integer age;
}
<form action="receiveUser" method="post">
   用户名:<input type="text" name="user.name" value="张三"></br>
   年龄:<input type="text" name="user.age" value="18"></br>
    <input type="submit" value="提交">
</form>
@RequestMapping("/receiveUser")
public void pojo(Subject user){
      User user = new User();
       user.setName(subject.user.getName());
       user.setAge(subject.user.getAge());
       return user;
}

测试
J2EE-020 Spring(五) Spring-MVC(上)

高级参数(数组,List)

数组

<form action="receiveArray" method="post">
    <c:forEach item="${userList}" var="user">
       用户名:<input type="text" name="username" value="${user.username}"></br>
       年龄:<input type="text" name="age" value="${user.age}"></br>
    </c:forEach>
    <input type="submit" value="提交">
</form>
@RequestMapping("/receiveArray")
public void pojo(Integer age[]){
   for(int age : ages)
   System.out.println(age);
}

List

<form action="receiveList" method="post">
    <c:forEach item="${userList}" var="user">
       用户名:<input type="text" name="userList[0].username"></br>
       年龄:<input type="text" name="userList[0].age"></br>
       用户名:<input type="text" name="userList[0].username"></br>
       年龄:<input type="text" name="userList[0].age"></br>
    </c:forEach>
    <input type="submit" value="提交">
</form>
@RequestMapping("/receiveList")
public void pojo(UserCustom userCustom){
   System.out.println(userCustom);
}
上一篇:SpringMVC笔记(三)


下一篇:常用的这5类SpringBoot注解,竟然还有人不知道?