使用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
类上注解@SqlResultSetMappings
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@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
链式的代码无疑更容易维护。