javaweb框架之springmvc

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";
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值