SpringMVC基础

SpringMVC

一:

1:SpringMvc基本步骤

  1. ​ 配置web.xml文件
  1. 创建springMVC-servlet.xml并配置—主要配置以下内容

    <!--开启注解-->
    <mvc:annotation-driven/>
    <!--扫描-->
    <context:component-scan base-package="com.shiro.test.mvc.controller">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
    
    <!--视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--配置视图前缀-->
        <property name="prefix" value="/WEB-INF/pages"/>
        <!--配置视图后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>
    
  2. 创建Controller

    • @Controller:通知spring需要被扫描的controller类,得到DispatcherServlet的解析
    • @RequestMapping(value = "gologin.html")DispatcherServlet根据这个配置中的url地址决定调用哪个方法,方法的返回值类型如果是字符串,说明返回的是一个视图
    @Controller
    public class LoginController {
        @RequestMapping(value = "gologin.html")
        public String goLogin() {
            // 根据springMVC-servlet.xml的视图解析器,所得的完整路径为:/WEB-INF/Pages/gologin.jsp
            return "gologin";
        }
    

2:SpringMVC的常用注解

2.1:@RequestMapping
  • 可以加在类名或方法名面前

  • 或同时加在两个位置

  • 最终的路径是两个位置的路径的组合

  • value是默认的名称,可以省略

    @Controller
    @RequestMapping("/hello")
    // 访问路径为:*/hello/world
    public class LoginController {
        @RequestMapping("/world")
        public String goLogin() {
            return "helloworld";
        }
    
2.2:@RequestMapping的请求方式
  • Get@RequestMapping(value = "gologin.html", method = RequestMethod.Get)
  • Post@RequestMapping(value = "gologin.html", method = RequestMethod.Post)
  • 如果不指定method,可以接受任何类型的请求
  • 如果请求方式不正确,会报出405错误
2.3:处理请求参数
  • 自动的表单参数匹配:表单中控件的name的值,和controller层方法的参数名一致,则匹配表单的controllerform

    <form action="/login.html" method="post">
        用户名:<input type="text" name="username"/>
        密码:<input type="password" name="password"/>
        <input type="submit" value="登录"/>${error}
    </form>
    
    // 提交
    @RequestMapping(value = "/login.html", method = RequestMethod.Post)
    public String login(String username, String password) {
        System.out.println("username:" + username);
        System.out.println("password:" + password);
    	return "redirect:world";
    }
    
  • 注解形式的参数匹配:当表单中控件的namecontroller方法中参数名不一致时,使用@RequestParam()注解

    <form action="/login.html" method="post">
        用户名:<input type="text" name="relname"/>
        密码:<input type="password" name="password"/>
        <input type="submit" value="登录"/>${error}
    </form>
    
    // 提交
    @RequestMapping(value = "/login.html", method = RequestMethod.Post)
    public String login(@RequestParam(value = "relname") String username, String password) {
        System.out.println("username:" + username);
        System.out.println("password:" + password);
    	return "redirect:world";
    }
    
  • defaultValue:属性设置上参数的默认值

    @RequestMapping(value = "/login.html", method = RequestMethod.Post)
    public String login(@RequestParam(value = "", defaultValue = "") String username, String password) {
        System.out.println("username:" + username);
        System.out.println("password:" + password);
    	return "redirect:world";
    }
    
  • required:设置参数是否可选

    @RequestMapping(value = "/login.html", method = RequestMethod.Post)
    public String login(@RequestParam(value = "", required = false) String username, String password) {
        System.out.println("username:" + username);
        System.out.println("password:" + password);
    	return "redirect:world";
    }
    
2.4:请求转发和跳转
  • 请求转发return "视图名称"
  • 请求跳转return "redirect: controller的mapping地址"
2.5:解决Post乱码

​ 在web.xml中做如下配置

<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>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
2.6:解决Get乱码的方案

乱码和tomcat版本有关联

  • 修改server.xml

    <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>
    
  • 如果URL还乱码,则String message = URLEncoder.encode("用户名或密码错误","UTF-8")

2.7:@RequestHeader:获取请求头中的信息
@RequestMapping(value = "/login.html")
public String login(@RequestParamHeader(value="Accept-Language") String header) {
    System.out.println(header);
	return "redirect:world";
}
2.8:请求参数和请求头表达式

​ 通过表达式精确映射要求 ·

  • paramsheaders支持简单的表达式
  • params1:表示请求必须包含名为params1的请求参数
  • !params1:表示请求不能包含名为params1的请求参数
  • params1 != value1:表示请求包含名为params1的请求参数,但其值不能为value1
  • {"params1=value1","params2"}:请求必须包含名为params1params2的两个请求参数,且params1的参数值必须为value
@RequestMapping(value = "/login.html", params = {"username","age!=10"})
public String login(String username, String age) {
    System.out.println(username + "" + age);
	return "redirect:world";
}
2.9:ant风格的路径
  • Ant风格资源地址支持三种匹配符?:匹配文件名中的一个字符
    1. *:匹配文件名中的任意字符
    2. **:匹配多层路径
  • @RequestMapping还支持Ant风格的URL
2.10:使用pojo将数据从页面传递到controller
<form action="save" method="get">
    <label for="">用户名:<input type="text" name="username"/></label>
    <label for="">密码:<input type="text" name="password"/></label>
    <button>保存</button>
</form>
@RequestMapping(value = "/save")
public String save(User user) {
    System.out.println(user);
    return "success";
}
// pojo
public class User {
    private String username;
    private String password;
}
2.11:将数据从controller传递到页面
<form action="edit" method="get">
    <label for="">用户名:<input type="text" name="username" value=${user.username}/></label>
    <label for="">密码:<input type="text" name="password" value=${user.password}/></label>
    <button>保存</button>
</form>
// 方法一:ModelAndView
@RequestMApping(value = "/edit")
public ModelAndView edit() {
    User user = new User();
    user.setUsername("aime");
    user.setPassword("123");
    ModelAndView mv = new ModelAndView();
    mv.setViewName("");
    mv.addObject("user",user);
    return mv;
}
// 方法二:使用Map
@RequestMApping(value = "/edit")
public String edit(Map<String, Object> map) {
    User user = new User();
    user.setUsername("aime");
    user.setPassword("123");
    map.put("user", user);
    return user/form;
}

1:Rest:

Representational State Transfer,表现层状态转换,是目前最流行的一种互联网软件架构。

1.1:具体说,就是HTTP协议里面。四个表示操作方式的动词
  • GET:用来获取资源
  • POST:用来新建资源
  • PUT:用来更新资源
  • DELETE:用来删除资源
1.2:HiddenHttpMethodFilter

浏览器form表单只支持GET和POST请求,不支持DELETE和PUT请求

Spring添加了一个过滤器,可以将这些请求转换为标准的http方法,支持GET,POST,PUT,DELETE

2:创建Restful应用程序

2.1:配置过滤器
<filter>
	<filter-name>HiddenHttpMethodFilter</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
	<filter-mapping>HiddenHttpMethodFilter</filter-mapping>
    <url-pattern>/*</url-pattern>
</filter-mapping>
2.2:jsp页面
<form action="1" method="post" id="deleteForm">
    <input type="text" name="_method" value="DELETE"/>
    <button>DELETE提交</button>
</form>
2.3:Controller
@RequestMapping(value="/{id}", method=RequestMethod.DELETE)
public String delete() {
    //执行删除
    System.out.println("delete");
    return "redirct:/user/list";
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值