1 场景
本文主要用来搭建ssm环境中的spring、springMvc的部分。
1.1 版本说明
jdk版本:1.8
spring版本:5.2.2.RELEASE
1.2 代码地址
https://github.com/yjhcpdd/mymvc
1.3 项目结构
--java
--resources
--conf
-spring.xml*********[1]
-spring-mvc.xml*****[2]
--properties
-system.properties**[3]
--webapp
--css
--img
--js
--jsp
--WEB-INF
-web.xml************[4]
java外层包路径为:com.demo.cs
2 搭建步骤
2.1 配置maven依赖
pom.xml中配置相关依赖包:
<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.version>5.2.2.RELEASE</spring.version>
<jackson.databind.version>2.11.0</jackson.databind.version>
</properties>
<dependencies>
<!-- ==========【Web相关】========== -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- ==========【spring、springMvc相关】========== -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</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>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- SpringMVC会自动添加Jackson的转换器,支持@ResponseBody将对象转换成json,jackson的版本需与springMvc的版本进行对应 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.databind.version}</version>
</dependency>
<!-- ascpectJ支持aop -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.6</version>
</dependency>
<!-- ==========【单元测试】========== -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<!-- ==========【文件上传】========== -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<!-- ==========【工具类】========== -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.10</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
</dependencies>
2.2 配置程序入口
web.xml[4]
配置spring和springMVC的程序入口。
<!-- ============【spring配置】============ -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:conf/spring.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- ============【springMvc配置】============ -->
<!-- spring编码过滤器(防止“post提交”、“上传文件文件名”中文乱码) -->
<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>
<!-- springMVC核心servlet -->
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:conf/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
2.3 spring配置
spring.xml[1]
用来配置spring。
<!-- 通过扫描器实现bean的自动载入(只扫描非Controller注解,防止ContextLoaderListener扫描的事务失效) -->
<context:component-scan base-package="com.demo.cs">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 引入配置文件 -->
<context:property-placeholder location="classpath:properties/system.properties" />
<!-- 使用cglib动态代理(默认为JDK动态代理,只可代理接口实现) -->
<aop:aspectj-autoproxy proxy-target-class="true" />
2.4 springmvc配置
spring-mvc.xml[2]
用来配置springMVC。
<!-- 通过扫描器实现bean的自动载入(只扫描Controller注解,防止ContextLoaderListener扫描的事务失效)
use-default-filters="false"需和include-filter配合使用,否则默认仍然会扫描所有注解-->
<context:component-scan base-package="com.demo.cs" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 开启注解驱动模式。默认注册RequestMappingHandlerMapping,RequestMappingHandlerAdapter,ExceptionHandlerExceptionResolver
以支持@RequestMapping,@ExceptionHandler以及其他注解的控制器方法的请求处理。-->
<mvc:annotation-driven/>
<!--当一个请求找不到处理器时将会把它交给容器本身处理(tomcat)-->
<mvc:default-servlet-handler/>
<!--配置静态资源访问路径。 -->
<mvc:resources mapping="/css/**" location="/css/" />
<mvc:resources mapping="/img/**" location="/img/" />
<mvc:resources mapping="/js/**" location="/js/" />
<!-- 视图解析器 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/jsp/"/>
<!-- 后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
<!-- 支持文件上传(bean的id需配置成"multipartResolver") -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" >
<!--上传文件的最大大小,单位为字节 -->
<property name="maxUploadSize" value="1073741824"></property>
<!-- 上传文件的编码 -->
<property name="defaultEncoding" value="UTF-8"></property>
</bean>
3 代码示例
实体类:
@Data
public class TempUser {
private String userName;
private Integer age;
}
3.1 controller定义
@Controller
@RequestMapping("tempUser")
public class TempUserController {
......
}
3.1 加载页面
@RequestMapping("init")
public ModelAndView init(TempUser form){
ModelAndView modelAndView=new ModelAndView("template/user/user_list");
modelAndView.addObject("xxx",xxx);
return modelAndView;
}
3.2 执行业务操作
@ResponseBody
@RequestMapping("doBusniess")
public Object doBusiness(TempUser form){
//doBusiness......
Map<String,Object> resultMap=new HashMap<>();
resultMap.put("success",true);
resultMap.put("xxx",xxx);
return resultMap;
}
3.3 接收json
@ResponseBody
@RequestMapping("doJsonBusiness")
public Object doJsonBusiness(@RequestBody TempUser tempUser){
//doBusiness......
Map<String,Object> resultMap=new HashMap<>();
resultMap.put("success",true);
resultMap.put("xxx",xxx);
return resultMap;
}
3.4 上传文件
@ResponseBody
@RequestMapping("doUploadFile")
public Object doUploadFile(HttpServletRequest request,TempUser form) throws IOException {
MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;
//获取文件信息
MultipartFile multipartFile = multipartHttpServletRequest.getFile("file");
//文件名:multipartFile.getOriginalFilename()
//文件是否存在:multipartFile.isEmpty()
//文件字节大小:multipartFile.getSize()
//获取文件字节数组:multipartFile.getBytes()
//获取文件输入流:multipartFile.getInputStream()
//拷贝文件:multipartFile.transferTo(...);
Map<String,Object> resultMap=new HashMap<>();
resultMap.put("success",true);
resultMap.put("xxx",xxx);
return resultMap;
}
3.5 下载文件
@ResponseBody
@RequestMapping("doDownloadFile")
public void doDownloadFile(HttpServletRequest request,HttpServletResponse response){
File file=new File("D:\\Elasticsearch权威指南(中文版).pdf");
String fileName=file.getName();
//-----------------开始下载文件-------------
try(ServletOutputStream out=response.getOutputStream();
FileInputStream input=new FileInputStream(file);
) {
response.reset();
response.setContentType("application/octet-stream; charset=utf-8");
//防止文件名中文乱码
fileName=URLEncoder.encode(fileName,"UTF-8");
String agent=request.getHeader("User-Agent");
if(StringUtils.isNotEmpty(agent)&&agent.toUpperCase().indexOf("MSIE")<0){
///其他浏览器
response.setHeader("Content-Disposition","attachment; filename*=utf-8'zh_cn'"+fileName);
}else{
///IE浏览器(6,7,8,9)
response.setHeader("Content-Disposition","attachment; filename="+fileName);
}
//全部拷贝
//out.write(FileUtils.readFileToByteArray(file));
//缓存拷贝
IOUtils.copyLarge(input,out,new byte[1024]);
out.flush();
}catch (Exception e){
e.printStackTrace();
}
}
4 其他代码
4.1 jquery发送ajax请求
发送json形式的请求
$.ajax({
type: "POST",
url:"<%=basePath%>/tempUser/doJsonBusiness",
//将JavaScript值转换为JSON字符串,使请求以json的形式传输到后台
data: JSON.stringify({"userName":"张三","age":18}),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (res) {
alert(JSON.stringify(res));
},
error: function () {
alert("通信异常,访问失败!");
}
});
4.2 文件上传
建议动态创建from元素的形式,将下载事件绑定到按钮上(提单原始表单内按钮提交下载的形式),此种方式,更加灵活。
网友评论