1.通过maven ,创建 webApp骨架项目,完成java文件夹的项目结构,并为web项目配置好Tomcat服务器。
具体步骤参照:https://blog.csdn.net/qq847196660/article/details/95232957
2.maven导入相关依赖jar.
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<!--spring相关jar版本锁定-->
<spring.version>5.0.2.RELEASE</spring.version>
</properties>
<dependencies>
<!--spring核心依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!--spring Servlet API, (JSP API, JSTL, Commons FileUpload, COS) 依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<!--包括框架的Servlets,Web MVC框架,控制器和视图支持(spring-support,Tiles,iText,POI)-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!--servlet依赖jar-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<!--jsp依赖jar-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
3.写引用实体类,并实习序列化接口。
4.准备控制器,视图解析器,中文乱码过滤器,时间解析器,jsp页面。前端控制器 web.xml 配置
控制器:Controller
//控制器类, @Controller //超链接先访问,这个控制器类,再访问控制器下的具体哪个方法 地址的注解
@RequestMapping(path = “/helloController”) public class
HelloController {
/***控制器的执行具体流程
* 1.点击index.jsp 里面的超链接,得到地址,发给控制器,
* 2.控制器在自己容器中,找对应的path 路径连接 (注解的方法)
* 3.找到了,执行方法,有返回值,就把值返回给控制器。
* 4.控制器,再去找视图解析器,把值给它
* 5.通过视图解析器,先找springmvc.xml 视图解析器IOC容器中
* 对应的路径,在把得到的值,与文件后缀,进行组装,得到要访问的具体页面
* 6.再返回给控制器,控制器再给响应的具体页面进行展示
*/@RequestMapping(path = "/hello") public String sayHello(Student stu){ System.out.println("你好,mvc"); System.out.println(stu); //把时间属性,再转为字符串格式:1995-5-9 DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); String time = df.format(stu.getAct().getTime()); System.out.println(time); return "success"; } }
时间解析器:StringToDateConverter
//自定义时间转换器类,需要在springmvc.xml 中配置进IOC容器中
public class StringToDateConverter implements Converter<String, Date> {
@Override
public Date convert(String s) {
if(s.equals(null)){
throw new RuntimeException("时间参数没有传");
}
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
try {
return df.parse(s);
} catch (ParseException e) {
throw new RuntimeException("时间参数可能格式不对,解析不成功");
}
}
}
jsp页面:index.jsp,success.jsp
index.jsp:
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2019/7/24 0024
Time: 下午 6:12
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--表单中包含一个学生类中的所有元素--%>
<form action="helloController/hello" method="post">
学号:<input type="text" name="id"></br>
姓名:<input type="text" name="name" ></br>
年龄:<input type="text" name="age"></br>
性别:<input type="text" name="sex"></br>
账户号:<input type="text" name="act.id"></br>
学生地址:<input type="text" name="act.time"></br>
账户金额:<input type="text" name="act.money"></br>
<input type="submit" value="提交学生"></br>
</form>
</body>
</html>
success.jsp:
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2019/7/24 0024
Time: 下午 6:31
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--执行方法后,通过控制器,和视图解析器,
跳转到最后的页面,并且在客户端显示--%>
<h3>入门成功</h3>
</body>
</html>
前端页面控制器:web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--前端控制器
启动服务器的时候,会创建servlet,
创建servlet,就会读取springmvc.xml 文件,把里面的配置添加进IOC容器-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--<load-on-startup>1</load-on-startup>的作用
1)load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法)。
2)它的值必须是一个整数,表示servlet应该被载入的顺序
3)当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;
4)当值小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载。
5)正数的值越小,该servlet的优先级越高,应用启动时就越先加载。
6)当值相同时,容器就会自己选择顺序来加载。-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!--写 / 的意思是,发任何请求,都会经过这个Servlet-->
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--配置解决中文乱码的过滤器-->
<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>
<!--红线报错不用管-->
</web-app>
视图解析器,和配置springmvc.xml IOC容器
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
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.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--开启注解的扫描-->
<context:component-scan base-package="cn.wuwei"></context:component-scan>
<!--视图解析器-->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<!--找 prefix 值 路径下这个目录下 -->
<property name="prefix" value="/WEB-INF/pages/"/>
<!--找 suffix 值 后缀名为.jsp 的文件-->
<property name="suffix" value=".jsp"/>
</bean>
<!--配置自定义类型转换器-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="cn.wuwei.utils.StringToDateConverter"/>
</set>
</property>
</bean>
<!--开启springMVC 框架注解的支持-->
<mvc:annotation-driven conversion-service="conversionService"/>
</beans>
day36 2019-09-03 springmvc笔记
六、@RequestMapping注解(重点)
1. @RequestMapping 请求路径映射,该注解可以标记在方法上,也可以标记在类上
标记在类上用来窄化路径
2. 属性
path:指定请求路径,别名value,所以属性名可以省略
method: 请求方式:
get: 路径和超链接请求都是get请求
post: 必须在表单中实现
params:声明请求路径的规则 -- 了解
"name":路径中必须有name
"age>20":路径中必须有age>20
"!name" :路径中不存在name
七、参数的绑定(重点)
1. 表单中提交的name值与方法中的参数(简单类型)名称一致,就可以直接获取到
2. 方法的参数:pojo类型
只要保证表单提交的name值与pojo的属性名一致,就可以封装数据
3. @RequestParam:请求参数绑定,name与参数名不一致
属性: value, name可以指定页面表单中的name值
requird: 是否必须的 , false ,不必要的(可有可无), true:必须有该参数
defaultValue: 默认值,如果页面传参了,则使用页面传参的值,如果没有指定,则使用默认值
4. 特殊情况:(自定义类型转换器)要转换类型是Date类型
1)自定义类型转换类
/**
*
* 自定义类型转换器
* 将字符串格式转换为日期格式
* 1. 实现接口converter<S,T>
* S:源类型 -- String
* T:目标类型-- Date
* @author 黑马程序员
* @Company http://www.ithiema.com
* @Version 1.0
*/
public class StringToDateConverter implements Converter<String ,Date>{
/**
* 类型转换方法
* @param source 源
* @return 目标
*/
@Override
public Date convert(String source) {
//日期类型的转换对象
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
Date date = null;
try {
date = sdf.parse(source);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
2. 在springmvc.xml文件中配置类型转换工厂
<!--类型转换工厂-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.itheima.converter.StringToDateConverter"></bean>
</set>
</property>
</bean>
3. 在注解驱动中引入类型转换工厂
<!--注解驱动: 关联类型转换工厂-->
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
八、编码过滤器(重点)
<!--编码过滤器-->
<filter>
<filter-name>CharactorEncoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!--配置初始化参数,指定编码格式:拦截的是post请求-->
<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>CharactorEncoding</filter-name>
<!--拦截所有的请求:不包含静态资源的-->
<url-pattern>/*</url-pattern>
</filter-mapping>