javaweb框架之springmvc

来源:互联网 发布:阿里云 香港节点 速度 编辑:程序博客网 时间:2024/06/06 05:48

1、springmvc

是一个轻量级的前端mvc框架,类似struts2,但是比stuts2使用方便,而且性能要高于struts2.
springmvc和spring是什么关系?

springmvc仅仅是spring框架下的一个web框架。可以单独使用,不依赖于spring,但是和spring集成最方便(相对struts2)

2、快速入门

2.1. xml配置

1.需要配置web.xml

<!-- DispatcherServlet:前端控制器 配置前端控制器servlet --><servlet>    <servlet-name>springmvc</servlet-name>    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    <!--加载前端控制器配置文件 上下文配置位置 -->    <init-param>        <!--contextConfigLocation:指定springmvc配置的加载位置, 如果不指定则默认加 载WEB-INF/[DispatcherServlet的Servlet名字]-servlet.xml(例如springmvc-servlet.xml)。 -->        <param-name>contextConfigLocation</param-name>        <param-value>classpath*:spring-mvc.xml</param-value>    </init-param>    <!-- 表示随WEB服务器启动 -->    <load-on-startup>1</load-on-startup></servlet><servlet-mapping>    <servlet-name>springmvc</servlet-name>    <!-- 可以拦截二种请求         第一种:拦截固定后缀的url,比如设置为 *.do、*.action, 例如:/user/add.action 此方法最简单,不会导致静态资源(jpg,js,css)被拦截         第二种:拦截所有 设置为/, 例如:/user/add /user/add.action,此方法可以实现REST风格的url 很多互联网类型的应用使用这种方式.但是此方法会导致静态文件(jpg,js,css)被拦截后不能正常显示.需要特殊处理         错误设置:拦截所有,设置为/*,此设置方法错误,因为请求到Action, 当action转到jsp时再次被拦截,提示不能根据jsp路径mapping成功. -->    <url-pattern>/</url-pattern></servlet-mapping>

2.导包

    <!-- sping web Controller层的核心包 -->    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-web</artifactId>        <version>4.1.6.RELEASE</version>    </dependency>    <!-- spring-webmvc view层的核心包 -->    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-webmvc</artifactId>        <version>4.1.6.RELEASE</version>    </dependency>    <!-- servlet 3.x -->    <dependency>        <groupId>javax.servlet</groupId>        <artifactId>javax.servlet-api</artifactId>        <version>3.1.0</version>        <!-- 发布的时候,不发布servlet-api -->        <scope>provided</scope>    </dependency>    <!-- https://mvnrepository.com/artifact/javax.servlet.jsp/jsp-api -->    <dependency>        <groupId>javax.servlet.jsp</groupId>        <artifactId>jsp-api</artifactId>        <version>2.1</version>        <!-- 发布的时候,不发布jsp-api -->        <scope>provided</scope>    </dependency>

3.在resources下增加springmvc的配置文件spring-mvc.xml,注意名称要和web.xml加载的配置文件名称一致

<?xml version="1.1" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">    <!-- 处理器映射器 -->    <!-- 根据bean的name进行查找Handler处理器 将请求的url配置在bean的name中 -->    <!-- 这是一个默认的映射处理器,即使不配置,那么也是默认就是这个 -->    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>    <!-- HandlerAdapter适配器 -->    <!-- 注意:这个适配器不是必须配置的,这是默认的、他在servlet容器已启动就被加载-->    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>    <!-- 就是配置url请求的路径和对应的实现类-->    <bean name="/hello" class="springmvc.HelloController"></bean></beans>
  1. 编写Controller,需要实现接口Controller

    public ModelAndView handleRequest(HttpServletRequest request,
    HttpServletResponse response) throws Exception {

     ModelAndView mv = new ModelAndView(); //这一步相当于request.setAttribute(“hello”,”hello SpirngMVC!!!”) mv.addObject("hello", "hello SpirngMVC!!!"); mv.setViewName("/WEB-INF/views/hello.jsp");return mv;

    }

5.编写hello.jsp,然后进行发布测试

2.2. 注解

1、导包
2、web.xml配置DispatcherServlet
3、增加spring-mvc.xml

<!-- 自动扫描且只扫描@Controller --><context:component-scan base-package="springmvc"    use-default-filters="false">    <context:include-filter type="annotation"        expression="org.springframework.stereotype.Controller" />    <context:include-filter type="annotation"        expression="org.springframework.web.bind.annotation.ControllerAdvice" /></context:component-scan><!-- 自动加载RequestMappingHandlerMapping和RequestMappingHandlerAdapter --><mvc:annotation-driven /><!-- 定义JSP文件的位置 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">    <property name="prefix" value="/WEB-INF/views/" />    <property name="suffix" value=".jsp" /></bean>

4.编写Controller,注意:不需要实现接口Controller

@Controller@RequestMapping("/hello")public class HelloController {    //Controller是单例模式    public HelloController(){        System.out.println("Spring mvc 启动时仅仅实例化一次Controller");    }    @RequestMapping("/sayhello")    public String hello(Model model) throws Exception {         //这一步相当于request.setAttribute("hello","hello SpirngMVC!!!")        model.addAttribute("hello", "hello SpirngMVC!!!");        //返回spring配置文件的前缀(prefix)+hello+后缀(suffix)        return "hello";    } }

@Controller注解

  • 用于标识这个类是一个后端控制器,主要作用就是接受页面的参数,转发页面。中间的业务逻辑是调用业务类处理的这个就是MVC设计模式的思路。

@RequestMapping

  • 除了修饰方法,还可以修饰类
  • 在类上使用:提供初步的请求信息映射.相对于WEB应用的根目录(窄化请求)

5.编写hello.jsp,然后进行发布测试

3、请求映射

3.1 请求url映射

3.1.1 多url映射

@RequestMapping(value={"/showDemo1","/show/show/show"})public String showDemo(){    System.out.println("showDemo1....");    //打开demo页面    return "demo";}

3.1.2 ant风格

//多层级匹配//@RequestMapping("/show/**/showDemo2")//一级多字符匹配//@RequestMapping("/show/*/showDemo2")//一级一个字符匹配@RequestMapping("/show/??/showDemo2")public String showDemo(){    System.out.println("showDemo2...");    return "demo";}

3.1.1 模版映射

@RequestMapping("showDemo3/{id}")public String showDemo3(@PathVariable("id") String id){    System.out.println("id="+id);    System.out.println("showDemo3...");    return "demo";}

3.1.1 正则表达式映射

3.2 请求方法映射

//只过滤post请求//支持:GET,POST,HEAD, PUT, PATCH, DELETE, OPTIONS, TRACE//只有GET和POST最常用//如果不写method属性,那么所有请求都将映射到这个方法@RequestMapping(value="/showDemo4",method=RequestMethod.POST)public String showDemo(){    System.out.println("通过请求方法过滤映射...");    return "demo";}

3.3 请求参数映射

//过滤参数中含有name的url请求//http://127.0.0.1:8080/springmvc-requestmapping/showDemo5?name=zhangsan@RequestMapping(value="/showDemo5",params="name")public String showDemo1(){    System.out.println("含有name");    return "demo";}

3.4 请求头映射

//只允许请求头里面主机名是"127.0.0.1:8080"的才能访问@RequestMapping(value="/showDemo6", headers="Host=127.0.0.1:8080")public String showDemo(){    System.out.println("通过请求头限定...");    return "demo";}

4、请求数据绑定

  • @RequestParam 绑定单个请求数据,可以是URL中的数据,表单提交的数据或上传的文件;
  • @PathVariable 绑定URL模板变量值
  • @CookieValue 绑定Cookie数据
  • @RequestHeader 绑定请求头数据

4.1. 通过注解标签

@RequestMapping(value="/addUser",method=RequestMethod.GET)public String addUser(){    return "addUser";}@RequestMapping(value="/saveUser",method=RequestMethod.POST)public String saveUser(@RequestParam("name") String name, @RequestParam("age") int age){    System.out.println("name="+name);    System.out.println("age="+age);    return "user";}@RequestMapping(value="/showUser/{id}")public String showUser(@RequestHeader("Host") String host, @CookieValue("JSESSIONID") String jsessionId,@PathVariable("id") int id){    System.out.println("Host="+host);    System.out.println("jsessionId="+jsessionId);    System.out.println("id="+id);    return "user";}

4.2. 通过javabean绑定表单数据

addStudent.jsp

<form action="${pageContext.request.contextPath }/student/saveStudent" method="post">    <label>        <span>姓名:</span>        <input type="text" name="name">    </label>    <label>        <span>年龄:</span>        <input type="text" name="age">    </label>    <label>        <span>手机:</span>        <input type="text" name="mobile">    </label>    <label>        <span>微信:</span>        <input type="text" name="weixin">    </label>    <label>        <span>爱好:</span>        <input type="text" name="hobby">    </label>                    <input type="submit" value="增加"></form>

StudentController.java

@RequestMapping("/saveStudent")public String saveStudent(Student student){    System.out.println(student);    //去学生列表页面    return "student";}

4.3. 绑定列表数据

addPersons.jsp

 <form action="${pageContext.request.contextPath}/person/savePersons" method="post">     姓名:<input type="text" name="persons[0].name"/>     年龄:<input type="text" name="persons[0].age"/>      身高:<input type="text" name="persons[0].height"/>      体重:<input type="text" name="persons[0].weight"/><br/>      姓名:<input type="text" name="persons[1].name"/>     年龄:<input type="text" name="persons[1].age"/>      身高:<input type="text" name="persons[1].height"/>      体重:<input type="text" name="persons[1].weight"/><br/>      姓名:<input type="text" name="persons[2].name"/>     年龄:<input type="text" name="persons[2].age"/>      身高:<input type="text" name="persons[2].height"/>      体重:<input type="text" name="persons[2].weight"/><br/>           <input type="submit" value="保存"/> </form>

Persons.java

public class Persons {    private List<Person> persons = new ArrayList<Person>();    public List<Person> getPersons() {        return persons;    }    public void setPersons(List<Person> persons) {        this.persons = persons;    }}

Person.java

public class Person {

private String name;private int age;private int height;private int weight;//setter...//getter...//toString...

}

PersonsController.java

@RequestMapping("/savePersons")public String savePersons(Persons persons){    System.out.println(persons.getPersons());    return "persons";}
原创粉丝点击