一、MVC设计模型

M    model模型 JavaBean
V	 View视图  JSP
C  	 Controller控制器 Servlet

二、SpringMVC是什么

	SpringMVC是-种基于Java的实现MVC设计模型的请求驱动类型的轻量级Web框架,属于Spring 
FrameWork的后续产品,已经融合在Spring Web Flow里面。Spring框架提供了构建Web应用程序的全功
能MVC模块。使用Spring可插入的MVC架构,从而在使用Spring进行WEB开发时,可以选择使用Spring
的Spring MVC框架或集成其他MVC开发框架,如Struts1 (现在一般不用),Struts2等。
	它通过一套注解,让一个简单的Java类成为处理请求的控制器,而无须实现任何接口。同时它还支持
RESTful编程风格的请求。

三、Spring入门程序

需求:点击超链接发送请求-->编写类-->编写方法-->转发到成功JSP页面

1、搭建开发的环境
	<properties>
	<!-- 版本锁定 -->
		<spring.version>5.0.2.RELEASE</spring.version>
	</properties>
	
	<dependencies>
	  <dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-context</artifactId>
	    <version>${spring.version}</version>
	  </dependency>
	  <dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-web</artifactId>
	    <version>${spring.version}</version>
	  </dependency>
	  <dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-webmvc</artifactId>
	    <version>${spring.version}</version>
	  </dependency>
	  <dependency>
	    <groupId>javax.servlet</groupId>
	    <artifactId>servlet-api</artifactId>
	    <version>2.5</version>
	    <scope>provided</scope>
	  </dependency>
	  <dependency>
	    <groupId>javax.servlet.jsp</groupId>
	    <artifactId>jsp-api</artifactId>
	    <version>2.0</version>
	    <scope>provided</scope>
	  </dependency>
	
	  <dependency>
	    <groupId>junit</groupId>
	    <artifactId>junit</artifactId>
	    <version>4.11</version>
	    <scope>test</scope>
	  </dependency>
	</dependencies>
2、编写入门的程序
	详情看springmvc_day01_01_start此工程。
3、入门程序的简略讲解

入门程序的简略讲解

4、入门程序整体流程图

入门程序整体流程图

5、开启SpringMVC框架注解mvc:annotation-driven/
	作用:开启SpringMVC框架注解的支持
	描述:使用<mvc:annotation-driven>自动加载RequestMappingHandlerMapping(处理映射器)和RequestMappingHandlerAdapter(处理适配器),可用在SpringMVC.xml配置文件中使用<mvc:annotation-driven>替代注解处理器和适配器的配置。
6、RequestMapping注解
	/**
		作用:用于建立请求URL和处理请求方法之间的对应关系
    	属性:
	       value:用于指定请求的URL。它和path属性的作用是一样的
	       method:用于指定请求的方式
	       params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的key和value必须和配置的一模一样
	         例如:params={"username=王大妈"} 则 url中必须有 ?username=王大妈 并且username和王大妈必须一模一样
	       header:发送的请求当中,必须包含的请求头。
			注意:value和method非常常用,params和header并不常用
	*/
	示例: 
	@RequestMapping(value = "/testRequestMapping",params = {"username=王大妈"},headers = {"Accept"})
	public String testRequestMapping(){
	    System.out.println("测试RequestMapping注解。。。。");
	    return "success";
	}
四、参数的绑定
1、请求参数的绑定入门 (基本类型和String类型的参数绑定)

----------------------------------Java代码----------------------------------

@RequestMapping("/testParam")
public String testParam(String username,String password){
    System.out.println("执行了....");
    System.out.println("你的用户名:"+username);
    System.out.println("你的密码:"+password);
    return "success";
}

----------------------------------JSP代码----------------------------------

<%-- 请求参数绑定 --%>
<a href="/springmvc_start/param/testParam?username=hehe&password=root">请求参数绑定</a>
2、请求参数绑定,把数据封装到JavaBean的Account类中

注意:
1、name的赋值:必须和JavaBean类的变量名一致,否则无法绑定参数
2、当JavaBean类中有引用对象User时,通过user.uname进行赋值
----------------------------------Java代码----------------------------------

	@RequestMapping("/saveAccount")
public String saveAccount(Account account){
    System.out.println("执行了....");
    System.out.println(account);
    return "success";
}

----------------------------------JSP代码----------------------------------

<form action="param/saveAccount" method="post">
    姓名:<input type="text" name="username"/> <br>
    密码:<input type="text" name="password"/> <br>
    金额:<input type="text" name="money"/> <br>
    用户姓名:<input type="text" name="user.uname"/> <br>
    用户年龄:<input type="text" name="user.age"/> <br>
    <input type="submit" value="提交"/> <br>
</form>
3、将数据封装到Account类中,类中存在list和map的集合

----------------------------------JSP代码----------------------------------

	<form action="param/saveAccount" method="post">
	    姓名:<input type="text" name="username"/> <br>
	    密码:<input type="text" name="password"/> <br>
	    金额:<input type="text" name="money"/> <br>
	    <%-- list集合的参数绑定 --%>
	    用户姓名:<input type="text" name="list[0].uname"/> <br>
	    用户年龄:<input type="text" name="list[0].age"/> <br>
	    <%-- map集合的参数绑定 --%>
	    用户姓名:<input type="text" name="map['one'].uname"/> <br>
	    用户年龄:<input type="text" name="map['one'].age"/> <br>
	    <input type="submit" value="提交"/> <br>
	</form>

----------------------------------Java代码----------------------------------

	@RequestMapping("/saveAccount")
	public String saveAccount(Account account){
	    System.out.println("执行了....");
	    System.out.println(account);
	    return "success";
	}
4、获取Servlet原生的API

获取方式:直接在方法的参数列表获取,获取后可直接使用

	@RequestMapping("/testServlet")
	public String testServlet(HttpServletRequest request, HttpServletResponse response){
	    System.out.println("执行了....");
	    System.out.println(request);
	    HttpSession session = request.getSession();
	    System.out.println(session);
	    ServletContext servletContext = session.getServletContext();
	    System.out.println(servletContext);
	    return "success";
	}
五、配置解决中文乱码的过滤器

----------------------------------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>
    </filter>
    <filter-mapping>
       <filter-name>characterEncodingFilter</filter-name>
       <url-pattern>/*</url-pattern>
    </filter-mapping>
六、自定义类型转换器

----------------------------------类型转换工具类----------------------------------

	/**
	 * 字符串转换成日期类型
	 * @author Vagaband
	 * @date 2020/5/24 15:33
	 */
	public class StringToDateConverter implements Converter<String, Date> {
	    /**
	     * String source  传入进来的字符串
	     * @param source
	     * @return
	     */
	    @Override
	    public Date convert(String source) {
	        // 判断
	        if (source == null) {
	            throw new RuntimeException("请您传入数据!");
	        }
	        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
	        try {
	            // 把字符串转换日期
	            Date parse = df.parse(source);
	            return parse;
	        } catch (Exception e) {
	            throw new RuntimeException("数据类型转换出现错误");
	        }
	    }
	
	}

----------------------------------springMVC.xml代码----------------------------------

	<!--配置自定义类型转换器-->
	<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
	    <property name="converters">
	        <set>
	            <bean class="cn.itcast.utils.StringToDateConverter"></bean>
	        </set>
	    </property>
	</bean>
		* 重点:最后一定要在annotation-driver 后面将配置写入,否则配置不会自动注入。
	<!--开启SpringMVC框架注解的支持-->
	<mvc:annotation-driven conversion-service="conversionService"/>
七、常用注解
1、常用注解:@RequestParam
	/**
	 * 常用注解1:@RequestParam
	 *      作用:把请求中指定名称的参数给控制器中的形参赋值。(通俗讲就是指定URL的传参名)
	 *           如果指定则必须URL请求体中的请求参数名必须和指定的一样否则报错404。
	 *      属性:
	 *          value:请求参数中的名称
	 *          required:请求从参数中是否必须提供此参数。默认值:true;表示必须提供,如果不提供则报错。
	 * @param username
	 * @return
	 */
	@RequestMapping("/testRequestParam")
	public String testRequestParam(@RequestParam(name = "name") String username){
	    System.out.println("执行了");
	    System.out.println(username);
	    return "success";
	}
2、常用注解:@RequestParam
	/**
	 * 常用注解2:@RequestParam
	 *    作用:用于获取请求体内容。直接使用得到是key=value&key=value...结构的数据
	 *         get请求方式不适用。
	 *    属性:
	 *         required是否必须有请求体。默认值是:true。当取值为true时,get请求方式会报错。如果取值为false,get请求达到null。
	 * @param body
	 * @return
	 */
	@RequestMapping("/testRequestBody")
	public String testRequestBody(@RequestBody String body){
	    System.out.println("执行了");
	    System.out.println(body);
	    return "success";
	}
3、常用注解:@RequestBody

-----------------获取请求体:直接拿到所有请求参数-----------------

	@RequestMapping("/testRequestBody")
	public String testRequestBody(@RequestBody String body){
	    System.out.println("执行了");
	    System.out.println(body);
	    return "success";
	}
4、常用注解:@PathVariable
	/**
	 * 常用注解4:PathVariable
	 *    作用:用于绑定url中的占位符。例如:请求url中/delete/{id},这个{id}就是url占位符
	 *         url支持占位符是spring3.0之后加入的。是springmvc支持rest风格URL的一个重要标志。
	 *    属性:
	 *         value:用于指定url中占位符名称。
	 *         required:是否必须提供占位符。
	 *    restful编程风格:
	 *         通过请求方式和{参数}来指定方法,。
	 */
	@RequestMapping("/testPathVariable/{sid}")
	public String testPathVariable(@PathVariable(name = "sid") String id){
	    System.out.println("执行了");
	    System.out.println(id);
	    return "success";
	}

--------------------URL中直接传入参数值就能获取到-------------------------

<a href="/springmvc_start/anno/testPathVariable/10">PathVariable</a>
5、不常用注解:@RequestHeader
	/**
	 * 不常用注解:@RequestHeader
	 *     作用:获取请求头的值
	 *     属性:
	 *        value:提供消息头的名称
	 *        required:是否必须有此消息头
	 *     注:实际开发中不常用
	 * @param header
	 * @return
	 */
	@RequestMapping("/testRequestHeader")
	public String testRequestHeader(@RequestHeader(value = "Accept") String header){
	    System.out.println("执行了");
	    System.out.println(header);
	    return "success";
	}
6、常用注解:@CookieValue
	/**
	 * 常用注解:@CookieValue
	 *     作用:用于指定cookie名称的值传入控制器方法参数
	 *     属性:
	 *        value:指定cookie的名称
	 *        required:是否必须有此cookie
	 *     注:实际开发中不常用
	 * @param cookieValue
	 * @return
	 */
	@RequestMapping("/testCookieValue")
	public String testCookieValue(@CookieValue("JSESSIONID") String cookieValue){
	    System.out.println("执行了");
	    System.out.println(cookieValue);
	    return "success";
	}
7、常用注解:@ModelAttribute
	/**
	 * 常用注解:@ModelAttribute
	 *    作用:可以用于修饰方法和参数
	 *       出现在方法上:表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法
	 *       出现在参数上:获取指定的数据给参数赋值。
	 *    属性:
	 *       value:用于获取数据的key。key可以使POJO的属性名称,也可以是map结构域的key。
	 *    应用场景: 当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据。
	 *          例如: 我们在编辑一个用户时,用户有一个创建信息字段,该字段的值是不允许被修改的。
	 *              在提交表单数据是肯定没有此字段的内容,一旦更新会把该字段内容置为null,此时就可以使用此注解解决问题。
	 *    两种使用方法:
	 *         1.当有返回值时:
	 *              通过返回值传递赋上为空的值。
	 *         2.当无返回值时:
	 *              存储:通过参数中定义的Map集合,使用map集合的put方法存储,Map的键用来取出,值用来存数据。
	 *              取出:通过在绑定参数的参数列表前添加@ModelAttribute("abc"),取出参数。
	 */
	/*有返回值的情况,表单提交少提交参数,通过showUser查询数据库参数进行提交。*/
	@RequestMapping("/testModelAttribute")
	public String testModelAttribute(User user){
	    System.out.println("testModelAttribute执行了");
	    System.out.println(user);
	    return "success";
	}
	 @ModelAttribute
	public User showUser(String uname){
	    System.out.println("showUser方法执行了....");
	    // 通过用户查询数据库 (模拟)
	    User user = new User();
	    user.setUname(uname);
	    user.setAge(20);
	    user.setDate(new Date());
	    return user;
	}

-------------------------无返回值的情况-------------------------

@RequestMapping("/testModelAttribute")
public String testModelAttribute(@ModelAttribute("abc") User user){
    System.out.println("testModelAttribute执行了");
    System.out.println(user);
    return "success";
}
@ModelAttribute
public void showUser(String uname, Map<String,User> map){
    System.out.println("showUser方法执行了....");
    // 通过用户查询数据库 (模拟)
    User user = new User();
    user.setUname(uname);
    user.setAge(20);
    user.setDate(new Date());
    map.put("abc",user);
}
8、常用注解:@SessionAttribute
	/**
	 * 常用注解:@SessionAttribute
	 *    作用:用于多次执行控制器方法间的参数共享。
	 *    属性:
	 *       value:用于指定存入的属性名称。
	 *       type:用于指定存入的数据类型。
	 * @return
	 */
	@RequestMapping("/testSessionAttributes")
	public String testSessionAttributes(Model model){
	    System.out.println("testSessionAttributes....");
	    // 底层会存储到request域当中
	    model.addAttribute("msg","花木兰");
	    return "success";
	}
	
	
	/**
	 * 获取Session中的值
	 * @param model
	 * @return
	 */
	@RequestMapping("/getSessionAttributes")
	public String getSessionAttributes(ModelMap model){
	    System.out.println("getSessionAttributes....");
	    String msg = (String) model.get("msg");
	    System.out.println(msg);
	    return "success";
	}
	
	
	/**
	 * 删除Session中的值
	 * @param status
	 * @return
	 */
	@RequestMapping("/delSessionAttributes")
	public String delSessionAttributes(SessionStatus status){
	    System.out.println("getSessionAttributes....");
	    status.setComplete();
	    return "success";
	}
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐