Shepard's Blog

Nothing is true everything is permitted


  • 首页

  • 标签

  • 分类

  • 归档

  • 公益404

  • 搜索

Angular登陆认证小例子

发表于 2016-08-04 | 分类于 JavaScript , Angular |

使用Angular来实现登陆跳转等功能的话,其实只要在ui-router的state中或者ngRoute中的when方法中添加对应的登陆判断变量,然后在根据相应的路由跳转事件中进行判断即可。

阅读全文 »

Angular表单部分知识点

发表于 2016-08-03 | 分类于 JavaScript , Angular |

收集一些使用Angular处理表单的知识点。

阅读全文 »

Angular零散知识点收集

发表于 2016-08-01 | 分类于 JavaScript , Angular |

收集一些平时使用Angularjs1.x及Angular Material碰到的问题的解决方法.

阅读全文 »

Spring Data JPA自定义查询

发表于 2016-07-31 | 分类于 Java , Spring |

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
19
public 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 Data JPA简单教程

发表于 2016-07-30 | 分类于 Java , Spring |

Spring Data JPA 简单教程。

阅读全文 »

Spring MVC部分知识点整理

发表于 2016-07-25 | 分类于 Java , Spring |

SpringMVC基于Servlet3无XML配置

一种maven改造快速支持servlet3.1web工程的方法

在Servlet3中,可以实现无Web.xml配置,需要一个类来实现WebApplicationInitializer接口

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
public class WebInitializer implements WebApplicationInitializer {

private static final String DISPATCHER_SERVLET_NAME = "dispatcher";

public void onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
//配置类,装载了SpringMVC的配置
ctx.register(WebMvcConfig.class);
ctx.setServletContext(servletContext);

registerHiddenHttpMethodFilter(servletContext);

Dynamic servlet = servletContext.addServlet(DISPATCHER_SERVLET_NAME, new DispatcherServlet(ctx));
servlet.addMapping("/");
servlet.setLoadOnStartup(1);
}

private void registerHiddenHttpMethodFilter(ServletContext servletContext) {
FilterRegistration.Dynamic fr = servletContext
.addFilter("hiddenHttpMethodFilter", HiddenHttpMethodFilter.class);
fr.addMappingForServletNames(
EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD),
false,
DISPATCHER_SERVLET_NAME);
}

}

如果要让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包含”.”号

Spring MVC @PathVariable with dot (.) is getting truncated

默认情况下,对于@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捕获异常

Spring MVC中的异常处理

首先创建一个异常类:

1
2
3
4
5
public 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\""));
}
}

Node.js部分框架知识点整理

发表于 2016-04-23 | 分类于 Node.js , Express |

使用Express框架及周边的一些框架碰到了一系列的问题,把解决方法整理记录一下。

阅读全文 »

Eclipse配置

发表于 2016-01-14 | 分类于 其他 |

取消项目JavaScript验证

Eclipse 去掉JavaScript Validator

选中一个项目,右键选择Properties,弹出的面板中点击Builders,然后将JavaScript Validator选项去掉,保存


修改快捷键

修改Eclipse快捷键的方法

Windows->Preferences->General->Keys,,如果有快捷键冲突可以先取消绑定Remove Binding,然后点击Binding输入框,按入快捷键会自动录入;如果需要在特定条件下触发可以选择When条件。


折叠代码

eclipse中函数不能折叠
Eclipse中如何折叠代码

在代码页行号左边的空白点击鼠标右键,弹出的菜单选择Folding,然后点击第一项Enable Folding即可。或者Windows->Preferences->Java->Editor->Folding,勾上Enable Folding。接下来可以使用快捷键来控制代码折叠了:
Ctrl+/(小键盘):折叠/展开代码
Ctrl+Shift+/(小键盘):折叠当前类代码
Ctrl+Shift+*(小键盘):展开当前类代码

Node.js配置

发表于 2016-01-14 | 分类于 Node.js |

Windows下安装Nodejs

Node.js环境搭建
Windows 系统下设置Nodejs NPM全局路径

在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
2
prefix = D:\nodejs
cache = D:\nodejs\npm_cache

其中prefix为npm包的安装路径,cache则为下载包的缓存路径。

阅读全文 »

Promise处理异步操作

发表于 2016-01-14 | 分类于 Node.js |

Promise
在Node.js 中用 Q 实现Promise – Callbacks之外的另一种选择
nodejs promise for q.js
利用q.js实现node 常用api的promise化
q

javascript中处理异步一般都是使用回调函数callback来解决的。但是这种写法很容易写出金字塔形的代码,可读性差。而是用promise链式的代码无疑更容易维护。

阅读全文 »
123…6
Shepard

Shepard

59 日志
25 分类
67 标签
GitHub
© 2015 — 2020 Shepard
由 Hexo 强力驱动
|
主题 — NexT.Mist v5.1.4