使用Angular来实现登陆跳转等功能的话,其实只要在ui-router的state中或者ngRoute中的when方法中添加对应的登陆判断变量,然后在根据相应的路由跳转事件中进行判断即可。
Spring Data JPA自定义查询
Spring Data Jpa预定义的接口提供了一系列的便利方法,如果这些方法仍不能满足需求,可以自定义查询接口。
自定义查询接口要用@NoRepositoryBean注解修饰,然后编写一个类实现它1
2
3
4
5@NoRepositoryBean
public interface QueryDao extends JpaRepository<UserBean, Integer> {
    public List<UserBean> getUsersByCondition(UserBean bean,String orderBy, String sc, int page, int size);
    public int countUsersByCondition(UserBean bean);
}
接下来是接口实现类:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45@NoRepositoryBean
public class QueryDaoImpl implements QueryDao {
    @Autowired
	private EntityManager em;
	
	public List<UserBean> getUsersByCondition(UserBean bean,String orderBy, String sc, int page, int size) {
	String hql = "from UserBean";
		hql += getUserCriteria(bean, orderBy, sc);
		Query q = em.createQuery(hql, UserBean.class);
		setUserPara(q, bean);
		q.setFirstResult(page);
		q.setMaxResults(size);
		return q.getResultList();
	}
	
	public int countUsersByCondition(UserBean bean) {
		String hql = "select count(1) from UserBean";
		hql += getUserCriteria(bean, "", "");
		Query q = em.createQuery(hql);
		setUserPara(q, bean);
		return new Long(q.getSingleResult().toString()).intValue();
	}
	
	private String getUserCriteria(UserBean ub,String orderBy,String sc){
		String criteria = " where 1=1";
		if(!CommonUtil.nullToEmpty(ub.getUsername()).equals("")){
			criteria += " and username like :username";
		}
		if(!CommonUtil.nullToEmpty(orderBy).equals("") && !CommonUtil.nullToEmpty(sc).equals("")){
			criteria += " order by "+orderBy+" "+sc;
		}
		return criteria;
	}
	
	private void setUserPara(Query q,UserBean ub){
		if(!CommonUtil.nullToEmpty(ub.getUsername()).equals("")){
			q.setParameter("username", "%"+ub.getUsername()+"%");
		}
	}
	
	//接口自带的方法,无需全部实现,直接返回null即可
	public List<UserBean> findAll() {return null;}
	public List<UserBean> findAll(Sort sort) {return null;}
	public List<UserBean> findAll(Iterable<Integer> ids) {return null;}
}
默认情况下查询出来的实体都是以类的形式返回,而且所有字段都会查询出来,如果需要返回部分字段,可以使用@SqlResultSetMappings注解。
首选在数据模型层的Model类上注解@SqlResultSetMappings1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25@Entity
@Table(name="user")
@SqlResultSetMappings(value={
  @SqlResultSetMapping(name="show_users",classes={
    @ConstructorResult(
	  targetClass=com.framework.bean.UserBean.class,
	  columns={
		@ColumnResult(name="id"),
		@ColumnResult(name="username"),
		@ColumnResult(name="createDate")
	})
  })
  //设置其他的映射
})
public class UserBean {
    private int id;
	private String username;
	private String password;
	private String createDate;
	private String timestamp;
	
	//必须提供对应的含有相同参数的构造函数
	public UserBean(int id, String username, String createDate) { 
	}
}
然后在查询中可以这样使用1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19public long count() {
	String sql = "select count(1) from users";
	//使用原生sql查询
	Query q = em.createNativeQuery(sql);
	return new Long(q.getSingleResult().toString()).intValue();
}
public List<UserBean> getByCondition(UserBean bean,String orderBy,String sc, int start, int size){
	String sql = "select * from users";
	sql += getCriteria(bean);
	//使用原生sql查询
	Query q = em.createNativeQuery(sql,"show_users");
	setParameter(q, bean);
	//分页
	q.setFirstResult(start);
	q.setMaxResults(size);
	Pageable pageable = new PageRequest(start,size,sc.equals("asc")?Direction.ASC:Direction.DESC,orderBy);
	Page<UserBean> page = new PageImpl<UserBean>(q.getResultList(), pageable, count());
	return page.getContent();
}
参考
spring data jpa 自定义全局DAO
JPA本地查询(Native Query)的总结1
JPA查询实体部分字段
How to query data via Spring data JPA by sort and pageable both out of box?
JPA : How to convert a native query result set to POJO class collection
Spring MVC部分知识点整理
SpringMVC基于Servlet3无XML配置
在Servlet3中,可以实现无Web.xml配置,需要一个类来实现WebApplicationInitializer接口
1  | public class WebInitializer implements WebApplicationInitializer {  | 
如果要让Maven项目支持Servlet3的配置,需要修改的地方就有点多了
首先要让项目本身支持
Servlet3,如果配置中的Project Facets不能做转换,可以到项目文件夹下找到一个隐藏文件夹.settings,然后找到org.eclipse.wst.common.project.facet.core.xml文件,打开并修改部分属性1
2
3
4
5
6
7
8
9<?xml version="1.0" encoding="UTF-8"?>
<faceted-project>
<fixed facet="wst.jsdt.web"/>
<!-- 改成合适的jdk版本 -->
<installed facet="java" version="1.7"/>
<installed facet="wst.jsdt.web" version="1.0"/>
<!-- 改成版本为3.1,即支持Servlet3.1的配置 -->
<installed facet="jst.web" version="3.1"/>
</faceted-project>然后在项目文件
pom.xml中的<build>节点下,<finalName>节点后添加如下配置1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</version>
<configuration>
<warSourceDirectory>src/main/webapp</warSourceDirectory>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
这样构建出来的项目就可以支持无XML风格的Servlet3项目了
Spring MVC 静态资源报错
Spring MVC: Resources
Spring MVC with Java based config - 404 not found for static resources
spring mvc 静态资源 404问题
在配置类中配置静态资源的访问路径:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17@Configuration
@EnableWebMvc
@ComponentScan
public class WebMvcConfig extends WebMvcConfigurerAdapter{
	@Bean 
	public ViewResolver viewResolver(){
		InternalResourceViewResolver resolver = new InternalResourceViewResolver();
		resolver.setPrefix("/WEB-INF/page/");
		resolver.setSuffix(".jsp");
		return resolver;
	}
	
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //指定resources文件夹下任意目录,子目录的资源文件配置访问路径到resources
		registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
	}
}
如果页面是在项目的主目录下则可以使用如下路径访问:1
<link href="resources/css/main.css" rel="stylesheet" type="text/css" />
如果是在子集目录下,例如http://localhost:8080/webtest1/index.html,则需要添加一个层次路径:1
<link href="../resources/css/main.css" rel="stylesheet" type="text/css" />
也可使用<c:url>来引入静态文件:1
2<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<script src="<c:url value='/resources/js/jquery.js' />"></script>
Spring 引入resources文件夹内的资源文件
Java (maven web app), getting full file path for file in resources folder?
对于Maven或者Gradle项目架构,资源文件一般放置于src/main/resources文件夹中,如果需要读取到这个文件夹下的资源文件,可以借助org.springframework.core.io.Resource:1
2
3//获取到resources下的config.properties文件
Resource resource = new ClassPathResource("config.properties");
File file = resource.getFile();
Spring 访问路径@PathVariable包含”.”号
默认情况下,对于@PathVariable注解获得的路径变量会把特殊符号给去掉,如果想要包含特殊符号(如”.”号),需要使用正则表达式:1
2
3
4@RequestMapping(value="/files/{filename:.+}", produces="application/json; charset=UTF-8")
public void checkFileInfo(@PathVariable String filename) {
    //例如filename = test1.xls
}
使用Gson作为Spring解析封装json的工具包
Configure Gson in Spring before using GsonHttpMessageConverter
想要替换Gson包为Spring解析json的工具包,需要在配置类中重写对应方法:1
2
3
4
5
6
7
8
9
10
11
12
13
14@Configuration
@EnableWebMvc
@ComponentScan
public class WebMvcConfig extends WebMvcConfigurerAdapter{
	@Override
	public void configureMessageConverters(
			List<HttpMessageConverter<?>> converters) {
		super.configureMessageConverters(converters);
		GsonHttpMessageConverter converter = new GsonHttpMessageConverter();
		Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE).create();
		converter.setGson(gson);
		converters.add(converter);
	}
}
接下来在使用了@ResponseBody注解的方法,或者直接标注了@RestController控制类中有返回数据的方法将全部通过Gson来封装成json格式的数据。
Spring MVC捕获异常
首先创建一个异常类:1
2
3
4
5public class ResourceNotFoundException extends Exception {
	public ResourceNotFoundException(String message) {
		super(message);
	}
}
然后建立一个异常处理类:1
2
3
4
5
6
7
8
9@ControllerAdvice
public class WopiExceptionHandler {
	@ResponseStatus(HttpStatus.NOT_FOUND)
	@ExceptionHandler(ResourceNotFoundException.class)
	@ResponseBody
	public String handlerResourceNotFound(ResourceNotFoundException ex) {
		return ex.getMessage();
	}
}
接下来在对应的控制类方法中抛出异常:1
2
3
4
5
6
7
8
9@RequestMapping(value="/files/{fileId}", method=RequestMethod.GET, produces="application/json; charset=UTF-8")
@ResponseBody
public WopiFileInfo checkFileInfo(@PathVariable String fileId) throws Exception {
	String filePath = wopiService.getFilePath(fileId);
	if (CommonUtil.isEmptyString(filePath)) {
		throw new ResourceNotFoundException("Resource not found/user unauthorized");
	}
	...
}
测试一下1
2
3
4
5
6
7
8
9
10
11
12@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = { TestConfig.class })
public class TestController {
	
	@Test
	public void testCheckFileInfo() throws Exception {
		mockMvc.perform(get("/files/{fileId}", "2"))
			.andExpect(status().isNotFound())
			.andExpect(content().string("\"Resource not found/user unauthorized\""));
	}
}
Eclipse配置
取消项目JavaScript验证
选中一个项目,右键选择Properties,弹出的面板中点击Builders,然后将JavaScript Validator选项去掉,保存
修改快捷键
Windows->Preferences->General->Keys,,如果有快捷键冲突可以先取消绑定Remove Binding,然后点击Binding输入框,按入快捷键会自动录入;如果需要在特定条件下触发可以选择When条件。
折叠代码
在代码页行号左边的空白点击鼠标右键,弹出的菜单选择Folding,然后点击第一项Enable Folding即可。或者Windows->Preferences->Java->Editor->Folding,勾上Enable Folding。接下来可以使用快捷键来控制代码折叠了:Ctrl+/(小键盘):折叠/展开代码Ctrl+Shift+/(小键盘):折叠当前类代码Ctrl+Shift+*(小键盘):展开当前类代码
Node.js配置
Windows下安装Nodejs
在Node.js官网默认给出的下载安装包是直接安装的,如果想获取免安装包需要点击下载下面的Other Downloads链接,选择Windows Binary (.exe)的文件下载即可。
下载了单文件之后放入到任意文件夹中,如D:/nodejs,将此路径加入到系统或用户的环境变量中。
打开命令行,输入命令node -v,如果有显示版本号,则说明配置成功。
下载nodejs包管理工具npm的源代码,点击Download ZIP按钮下载后将文件解压到任意文件夹中,如D:/nodejs/npm,进入命令行输入如下命令安装npm:1
node cli.js install -gf
待安装完成后输入命令npm -v,如果有显示版本号,则说明配置成功。
默认情况下,npm安装包以及缓存的路径在${APPDATA}\npm中,打开node_modules\npm\.npmrc文件,修改为以下内容:1
2prefix = D:\nodejs
cache = D:\nodejs\npm_cache
其中prefix为npm包的安装路径,cache则为下载包的缓存路径。
Promise处理异步操作
Promise
在Node.js 中用 Q 实现Promise – Callbacks之外的另一种选择
nodejs promise for q.js
利用q.js实现node 常用api的promise化
q
javascript中处理异步一般都是使用回调函数callback来解决的。但是这种写法很容易写出金字塔形的代码,可读性差。而是用promise链式的代码无疑更容易维护。