框架的基本搭建
第一步:
导入依赖jar包
第二步:
在web.xml文件中配置前端控制器–DispatcherServlet–
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
第三步:
创建spring.xml配置文件并开启注解扫描
作用:用来扫描@Controller注解
<context:component-scan base-package="com.zhiyou.controller"></context:component-scan>
第四步:
创建一个控制器类(加上@ContColleroller注解的就是控制器类),写具体的方法并在方法上个加上@RequestMapping()注解。
@RequestMapping("/go") //加在类上和方法上的RequestMapping中的字符串,会拼接起来,共同作为访问路径(/hello/go)
public String go(){
System.out.println("执行了");
return "/hellow.jsp"; //表示跳转到根目录下的hellow.jsp(相当于转发)
}
@RequestMapping()–注解的参数详解
参数绑定问题:
基本数据类型的参数:直接在ContColler的形参中写,有多少个参数就在方法中写多少个参数。
pojo类型的参数:form表单中的input标签中的name属性要与具体的pojo类中的属性名保持一致,在ContColler的形参中直接写具体的pojo对象
数组类型的参数:ContColler的形参中写–String[] xxx ----->xxx要与form表单中的input标签中的name属性名保持一致
List集合类型的参数:需要将集合放到具体的实体类中通过获得实体类的list属性来实现具体的传参
Map集合类型的参数:与List的用法一样
乱码问题:
在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>
自定义类型转换器:
1、编写一个类实现Converter接口重写convert方法
public class StringToDateConverter implements Converter<String, Date>{
/**
* 自定义转换器
* @param s
* @return
*/
@Override
public Date convert(String s) {
if (s == null){
throw new RuntimeException("请传入数据!");
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd");
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日");
try {
if (s.contains("-")){
return sdf.parse(s);
}else if (s.contains("/")){
return sdf1.parse(s);
}else if (s.contains("年")||s.contains("月")||s.contains("日")){
return sdf2.parse(s);
}else {
return null;
}
} catch (Exception e) {
throw new RuntimeException("数据类型转化错误!");
}
}
}
2、在spring.xml配置文件中注册转换器
<bean id="conversionService(名字任意)" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="自己编写的转换器的路径"/>
</set>
</property>
</bean>
3、引用转换器
//前提是必须引入mvc的约束
<mvc:annotation-driven conversion-service="conversionService"/>
图片上传问题:
文件上传步骤:
1、导入相关jar包
2、需要改造form表单 enctype=“multipart/form-data”
3、配置文件上传解析器
4、的到真实路径(辅助方法)
5、controller中写文件上传
6、测试–看看真实路径中有没有上传成功
第一步:
导入jar包:
第二步:
设置form表单的必要属性---------enctype=“multipart/form-data”-------------
第三步:
在spring.xml中配置CommonsMultipartResolver类
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize">
<value>2097152</value>
</property>
</bean>
第四步:
写一个辅助方法获得真实路径
//辅助方法
//得到真实路径
//真实路径从某一个盘符开始 盘符://xxxx/xxx/xx
@RequestMapping()
public String getRealPath(String path,HttpServletRequest request){//根据传入的项目路径得到真实路径
String realPath = request.getServletContext().getRealPath(path);
//根据改路径包装一个文件对象
File file = new File(realPath);
//判断文件夹是否存在,如果不存在就创建一个
if (!file.exists()){
file.mkdirs();//创建该文件夹
}
return realPath;
}
第五步:
实现具体的上传
@RequestMapping("/up")
public String up(MultipartFile ff, HttpServletRequest request) throws Exception{
//1根据文件得到输入流
InputStream inputStream = ff.getInputStream();
//2得到文件名称
String originalFilename = ff.getOriginalFilename();
//3根据项目路径得到真实路径
String path = "/img";
String realPath = getRealPath(path,request);
System.out.println("真实路径:" + realPath);
//4创建输出流
FileOutputStream fileOutputStream = new FileOutputStream(realPath + "/" + originalFilename);
//5上传的本质就是将文件从本地copy到服务器中
IOUtils.copy(inputStream, fileOutputStream);
//6关闭资源
fileOutputStream.close();
inputStream.close();
return "/index.jsp";
}
SpringMVC流程总结:
1、发送请求前的流程:
启动服务器首先加载web.xml配置文件,通过1标签加载前端控制器(实质就是一个Servlet)。加载前端控制器的同时加载spring.xml配置文件,进而开启注解扫描,把带有@Controller注解的类加载成对象放在IOC容器中并且是单例的。
2、发送请求后的流程:
发送请求后先进入前端控制器,根据请求路径找到具体的方法然后去执行方法并返回一个结果给前端控制器,前端控制器再去找视图解析器,视图解析器根据具体内容返回一个页面给前端控制器,前端控制器再响应给客户端。