项目总结(不断更新)

1 jsp文件在最上面加page指令

1
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

2 通过request 访问工程根路径

1
<%=request.getScheme()+ "://" + request.getServerName()+":"+request.getServerPort()+request.getContextPath()%>

3 共通jsp

1
2
3
4
5
6
7
8
9
10
11
<% 
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
request.setAttribute("basePath",basePath);
%>
// web.xml 有一个为所有页面引入其他页面的配置
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<include-prelude>/WEB-INF/jsp/system/common.jsp</include-prelude>
</jsp-property-group>
</jsp-config>

4 foreach 的使用

1
2
3
4
5
6
7
<c:forEach items="${list}" var="item" varStatus="s">
<tr>
<td>${s.index + 1}</td>
<td>${item.title}</td>
<td>${item.link}</td>
</tr>
</c:forEach>

5 提交文件

首先,DTO中有一个Spring 封装的类型字段

1
private MultipartFile imgFile;

然后使用transferTo()方法,里面的参数是File f =new File() 的f

1
adDto.getImgFile().transferTo();

6 真实部署环境

用户通过app,先访问硬负载,然后访问nginx,nginx都过负载均衡把请求散发到接口服务集群,接口服务集群和数据库服务器之间有一个缓存服务器来避免大量的数据库访问,同时,后台管理服务器由于几乎没有并发可以直接访问数据库服务器,同时,静态资源直接通过nginx来访问来加快访问速度,后台服务器也可以直接访问静态资源,数据库服务器中只保存图片的地址.

7 spring 读取配置文件的配置@Value注解.

1
2
@Value("${ad.path}")
private String path;

8 返回码的处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public enum PageCodeEnum {
ADD_SUCCESS(1000,"新增成功"),
ADD_FAIL(1001,"新增失败");
private Integer code;
private String msg;
public static final String KEY="pageCode";
PageCodeEnum(Integer code,String msg)
{
this.code=code;
this.msg=msg;
}
public Integer getCode() {
return code;
}
public String getMsg() {
return msg;
}
}

返回码的思路,

1
2
3
//写入数据库后,同时写入model
model.addAttribute(PageCodeEnum.KEY,PageCodeEnum.ADD_FAIL);
还进入原来的页面,这个页面中有一个hidden,所以在jsp中埋得值接收到了,接收到后,前端js在页面加载前先判断hidden是否为空.就输出了.

9 缓存要处理的一些常见问题

  • 集群化部署单机内缓存共享

1) 利用nginx 的转发规则,配置IPhash,根据请求用户的IP分配服务器

2) 使用redis 共享缓存

  • 同一用户高并发的重复请求
  • 处理缓存失效

10 Ajax 拿不到枚举类型的里面的值,只能拿到外面的字符串,要想前端ajax获取,可以再封装一层DTO,写一个新的构造函数

1
2
3
4
public ApiCodeDto(ApiCodeEnum apiCodeEnum) {
this.errno = apiCodeEnum.getErrno();
this.msg = apiCodeEnum.getMsg();
}

11 前后端都必须通过JSON格式传输数据. SpringMVC返回ajax 时一定记得加@ResponseBody

1
2
3
4
5
6
7
8
9
10
@RequestMapping(value = "aaa",method = RequestMethod.POST)
@ResponseBody
public AppleDto go()
{
AppleDto appleDto =new AppleDto("apple","red");
System.out.println("1111");

return appleDto;
//自动返回JSON
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<script type="text/javascript">
$(document).ready(function () {
console.log("123")
$.ajax({
url: "/aaa",//请求接口
type: "POST",//请求方式
//请求参数
dataType: "json",//响应类型
success: function(data, textStatus){//访问成功的回调函数,参数是响应,描述状态的字符串
console.log(textStatus)
console.log(data.name);
},
error: function(XMLHttpRequest, textStatus, errorThrown){//访问失败的回调函数,参数是XMLHttpRequest对象、错误信息、捕获的错误对象(可选);
}
});
});
</script>