[JAVA web]Spring MVC 枚举类型与数据库,登陆过滤器,时间类型映射
2015-04-23 10:43
501 查看
一、枚举类型的映射
1.如果一个对象里面有枚举类型的话,则Spring MVC是不能够直接进行注入的,因为它只实现了一些基本的数据类型的自动转换注入,但是其也提供了可扩展的接口,可以根据自己的需要来进行扩展。下面是网上查到的一个示例:
首先:这是一个枚举类:
Java代码
/**
* 新闻类别
* @author: ShangJianguo
* 2014-6-11 上午10:51:07
*/
public enum ENews {
company("0"), // 企业新闻
industry("1");// 行业新闻
private final String value;
private ENews(String v) {
this.value = v;
}
public String toString() {
4000
return this.value;
}
public static ENews get(int v) {
String str = String.valueOf(v);
return get(str);
}
public static ENews get(String str) {
for (ENews e : values()) {
if(e.toString().equals(str)) {
return e;
}
}
return null;
}
}
下面是个实体类:
Java代码
public class News {
private ENews type;
private String adminuid;
private String title;
private String summary;
private String author;
private String origin;
private String originurl;
private String content;
// 省略setter和getter方法
}
这里是controller层:
Java代码
@RequestMapping(value="/news/update", method=RequestMethod.POST)
@ResponseBody
public boolean edit_update(Map<String, Object> model,HttpServletRequest request,News news){
String adminid = getAdminid();
news.init(adminSO.getAdminByAdminid(adminid).getUid());
if (news != null) {
if (newsSO.update(news)) {
return true;
}
}
return false;
}
但是,到了这里程序还不能够正常的运行,真正的要点在下面,写一个枚举的转换类(Converter):
Java代码
public class StringToENewsConverter implements Converter<String, ENews>{
/* (non-Javadoc)
* @see com.fasterxml.jackson.databind.util.Converter#convert(java.lang.Object)
* @author: ShangJianguo
* 2014-6-12 下午4:56:30
*/
@Override
public ENews convert(String source) {
String value = source.trim();
if ("".equals(value)) {
return null;
}
return ENews.get(Integer.parseInt(source));
}
}
然后在spring mvc的配置文件中进行配置:
Java代码
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.ngenius.core.converters.StringToENewsConverter" />
</set>
</property>
</bean>
这样spring在进行对对象的字段进行注入的时候就可以运行了,直接把前端接收来的内容转换为ENews类型,进行封装。
上面的事例注意两个地方:
1.Integer.parseInt(String) 中的String必须为数字串,否则报错
2.枚举类型从“0”开始省事很多
2.关于数据库
上面的配置后传到controller内的类型为ENews类型,与数据库映射一种可行的方法是:
在相应get字段上
@Enumerated(EnumType.String)
并且数据库中用varchar()存储
即可完成后台到前台的映射
下面贴出我的代码:
UserController中一个传入一个传出
实体User中的Enum属性:
数据库中:
classType varchar(255)
存入的数据显示为:
前台jsp为:
Converter:
前台提交过来的String = "1"在Converter中变成了ClassType.Eng交给Controller,Controller调用service中hibernateTemplate直接save(user),枚举类型的String字段(这里为Eng)被存到数据库varchar()部分。
显示时从数据库拿到Eng转换为ClassType.Eng后,交给前台(前台直接拿到枚举)
二、登陆限制过滤器:
web.xml:
我一开始过滤的*.jsp写的是*
这样提交的请求如user/userRegister都会被过滤,这种类似action被过滤是不科学的
三、时间类型映射
转自:http://blog.csdn.net/z69183787/article/details/40373565
在使用 SpringMVC 的时候,我们可能需要将一个对象从 View 传递给 Controller 。而当这个 Object 只是一些简单的 String , int 或者 boolean 类型的成员变量时,SpringMVC 能自动将 View 层的 JSON 包含的 String 类型转换为 Object 成员变量相应的类型。但是当这个 Object 包 Date 类型的成员变量的时候, SpringMVC 在将 String转换成 Date 类型时,就会出错,报异常。但是我们又需要使用 Date 类型的时候,其实 Spring 给我们提供了简单的操作方式可以完成这个任务的。
SpringMVC 提供了一个注解 @DateTimeFormat 。可以将 View 传过来的 String类型转换为 Date 类型。具体使用方式很简单,直接在成员变量上加入注解就可以了,同时还可以指定 format 的格式,如下所示:
至此,不要以为完事大吉了,你还需要完成以下两个步骤才可以。
第一需要加入 joda 的 jar 包。因为在 @DateTimeFormat 注解中使用到了 joda 包中的相关东西,所以缺少这个包也是会报异常的。如果使用的直接导入 jar 包的话,去下载 joda-Jar 导入即可,如果使用的是 Maven 管理项目的 jar ,那么在配置文件文件中加入依赖:
第二需要在 SpringMVC 配置 xml 文件中(一般是 dispatchServlet.xml 文件)中加入配置: <mvc:annotation-driven /> 。这一句配置是一种简写,其实是给 Spring 容器中注入了两个 Bena ,分别是: DefaultAnnotationHandlerMapping 和AnnotationMethodHandlerAdapter 。 @DateTimeFormat 注解的内部同样需要使用到前面注入的两个 bean 去处理,所以缺少这个配置, Spring 容器中没有对应的 bean 去处理注解同样也会报错。至此,所有的步骤都完成了,可以跑了。
接下来我们跑跑测试一下,测试过程:
首先需要一个表单 :
用一个 Controller 接收:
好了,总结一下整个过程,其实就 3 步:
1 、 在 Date 类型的属性上加入 @DateTimeFormat 注解
2、 加入 joda 相关的包
3、 在 SpringMVC 配置文件中加入 <mvc:annotation-driven />
1.如果一个对象里面有枚举类型的话,则Spring MVC是不能够直接进行注入的,因为它只实现了一些基本的数据类型的自动转换注入,但是其也提供了可扩展的接口,可以根据自己的需要来进行扩展。下面是网上查到的一个示例:
首先:这是一个枚举类:
Java代码
/**
* 新闻类别
* @author: ShangJianguo
* 2014-6-11 上午10:51:07
*/
public enum ENews {
company("0"), // 企业新闻
industry("1");// 行业新闻
private final String value;
private ENews(String v) {
this.value = v;
}
public String toString() {
4000
return this.value;
}
public static ENews get(int v) {
String str = String.valueOf(v);
return get(str);
}
public static ENews get(String str) {
for (ENews e : values()) {
if(e.toString().equals(str)) {
return e;
}
}
return null;
}
}
下面是个实体类:
Java代码
public class News {
private ENews type;
private String adminuid;
private String title;
private String summary;
private String author;
private String origin;
private String originurl;
private String content;
// 省略setter和getter方法
}
这里是controller层:
Java代码
@RequestMapping(value="/news/update", method=RequestMethod.POST)
@ResponseBody
public boolean edit_update(Map<String, Object> model,HttpServletRequest request,News news){
String adminid = getAdminid();
news.init(adminSO.getAdminByAdminid(adminid).getUid());
if (news != null) {
if (newsSO.update(news)) {
return true;
}
}
return false;
}
但是,到了这里程序还不能够正常的运行,真正的要点在下面,写一个枚举的转换类(Converter):
Java代码
public class StringToENewsConverter implements Converter<String, ENews>{
/* (non-Javadoc)
* @see com.fasterxml.jackson.databind.util.Converter#convert(java.lang.Object)
* @author: ShangJianguo
* 2014-6-12 下午4:56:30
*/
@Override
public ENews convert(String source) {
String value = source.trim();
if ("".equals(value)) {
return null;
}
return ENews.get(Integer.parseInt(source));
}
}
然后在spring mvc的配置文件中进行配置:
Java代码
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.ngenius.core.converters.StringToENewsConverter" />
</set>
</property>
</bean>
这样spring在进行对对象的字段进行注入的时候就可以运行了,直接把前端接收来的内容转换为ENews类型,进行封装。
上面的事例注意两个地方:
1.Integer.parseInt(String) 中的String必须为数字串,否则报错
2.枚举类型从“0”开始省事很多
2.关于数据库
上面的配置后传到controller内的类型为ENews类型,与数据库映射一种可行的方法是:
在相应get字段上
@Enumerated(EnumType.String)
并且数据库中用varchar()存储
即可完成后台到前台的映射
下面贴出我的代码:
UserController中一个传入一个传出
@RequestMapping(value="/userRegister",method=RequestMethod.POST) public String register(User user){ System.out.println("in the userController"); // System.out.println("u: "+user.getUserName()); if(user!=null){userService.register(user);} return "success"; } @RequestMapping(value="/userList") public String show(Model model){ //System.out.println("in the show1"); //枚举还无法往前传 List<User> users=userService.listUsers(); model.addAttribute("users",users); System.out.println("in the show"); return "show"; }
实体User中的Enum属性:
public enum ClassType { Jap("0"), Eng("1"), Net("2"); private final String value; private ClassType(String value) { this.value = value; } public String toString() { return this.value; } public static ClassType get(int v) { String str = String.valueOf(v); return get(str); } public static ClassType get(String str) { System.out.println("what's values"+values().toString()); for (ClassType e : values()) { if(e.toString().equals(str)) { return e; } } return null; } }
@Enumerated(EnumType.STRING) @Column(name="classType") private ClassType classType;
数据库中:
classType varchar(255)
存入的数据显示为:
前台jsp为:
班级类型 <select name="classType"> <option value="1">英强</option> <option value="0">日强</option> <option value="2">网络</option> </select>
Converter:
public class StringToClassTypeConverter implements Converter<String, ClassType> { @Override public ClassType convert(String source) { System.out.println("in the convert of the StringToClassTypeConverter"); String value = source.trim(); if ("".equals(value)) { return null; } //System.out.println(Integer.parseInt(source)); //Integer.parseInt(String)中的string为数字串 return ClassType.get(source); } }
前台提交过来的String = "1"在Converter中变成了ClassType.Eng交给Controller,Controller调用service中hibernateTemplate直接save(user),枚举类型的String字段(这里为Eng)被存到数据库varchar()部分。
显示时从数据库拿到Eng转换为ClassType.Eng后,交给前台(前台直接拿到枚举)
二、登陆限制过滤器:
package net.gslab.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import org.springframework.util.StringUtils; import net.gslab.entity.User; import net.gslab.setting.CommonConstant; public class LoginFilter implements Filter { private static final String FILTERED_REQUEST = "@@session_context_filtered_request"; private static final String[] INHERENT_ESCAPE_URIS = { "/view/index.jsp", "/view/register.jsp","/view/login.jsp","/index.jsp","/view/infoSubmit" }; /** * Default constructor. */ public LoginFilter() { // TODO Auto-generated constructor stub } /** * @see Filter#destroy() */ public void destroy() { // TODO Auto-generated method stub } /** * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { if(request==null||response==null){ System.out.println("null request ot response in the doFilter"); } System.out.println("进入登录验证过滤器:"); if (request != null && request.getAttribute(FILTERED_REQUEST) != null) { // 如果没发送请求或者不是第一次访问过滤器,直接通过 System.out.println("直接通过过滤器"); chain.doFilter(request, response); } else { System.out.println("首次进入过滤器"); // 置位不再经过过滤器 request.setAttribute(FILTERED_REQUEST, Boolean.TRUE); HttpServletRequest httpRequest = (HttpServletRequest) request; User userContext = this.getSessionUser(httpRequest); System.out.println("userContext:"+userContext); // 用户为空且未登录 if (userContext == null && !isURILogin(httpRequest.getRequestURI(), httpRequest)) { // 拿到url String toUrl = httpRequest.getRequestURL().toString(); System.out.println("被过滤掉:用户未登录且访问了未授权页面"); // 拿到请求 if (!StringUtils.isEmpty(httpRequest.getQueryString())) toUrl += "?" + httpRequest.getQueryString(); System.out.println("toUrl" + toUrl); // 把想要访问的界面存到LOGIN_TO_URL里,转到登陆界面,一旦登陆成功就去那个页面 httpRequest.getSession().setAttribute( CommonConstant.LOGIN_TO_URL, toUrl); request.getRequestDispatcher("/view/login.jsp").forward( request, response); System.out.println("要return了啊========"); return; } else{ System.out.println("最后一个else==========="); chain.doFilter(request, response); } } } private boolean isURILogin(String requestURI, HttpServletRequest httpRequest) { // TODO Auto-generated method stub if (httpRequest.getContextPath().equalsIgnoreCase(requestURI) || (httpRequest.getContextPath() + "/") .equalsIgnoreCase(requestURI)) return true; for (String uri : INHERENT_ESCAPE_URIS) { if (requestURI != null && requestURI.indexOf(uri) >= 0) { return true; } } return false; } private User getSessionUser(HttpServletRequest httpRequest) { // TODO Auto-generated method stub User user = (User) httpRequest.getSession().getAttribute( CommonConstant.USER_CONTEXT); if (user == null) System.out.println("null user in the loginFilter"); return user; } /** * @see Filter#init(FilterConfig) */ public void init(FilterConfig fConfig) throws ServletException { // TODO Auto-generated method stub } }
web.xml:
<filter> <filter-name>loginFilter</filter-name> <filter-class>net.gslab.filter.LoginFilter</filter-class> </filter> <filter-mapping> <filter-name>loginFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping>
我一开始过滤的*.jsp写的是*
这样提交的请求如user/userRegister都会被过滤,这种类似action被过滤是不科学的
三、时间类型映射
转自:http://blog.csdn.net/z69183787/article/details/40373565
SpringMVC处理Date类型的成员变量方法
在使用 SpringMVC 的时候,我们可能需要将一个对象从 View 传递给 Controller 。而当这个 Object 只是一些简单的 String , int 或者 boolean 类型的成员变量时,SpringMVC 能自动将 View 层的 JSON 包含的 String 类型转换为 Object 成员变量相应的类型。但是当这个 Object 包 Date 类型的成员变量的时候, SpringMVC 在将 String转换成 Date 类型时,就会出错,报异常。但是我们又需要使用 Date 类型的时候,其实 Spring 给我们提供了简单的操作方式可以完成这个任务的。SpringMVC 提供了一个注解 @DateTimeFormat 。可以将 View 传过来的 String类型转换为 Date 类型。具体使用方式很简单,直接在成员变量上加入注解就可以了,同时还可以指定 format 的格式,如下所示:
<span class="keyword" style="font-weight: bold;">public</span> <span class="class" style="color: rgb(68, 85, 136); font-weight: bold;"><span class="keyword" style="color: rgb(51, 51, 51);">class</span> <span class="title">Person</span> {</span> <span class="indent"> </span><span class="keyword" style="font-weight: bold;">private</span> String name; <span class="indent"> </span><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">//直接在date类型上加入注解,同时指定格式样式</span> <span class="indent"> </span><span class="annotation">@DateTimeFormat</span>( pattern = <span class="string" style="color: rgb(221, 17, 68);">"yyyy-MM-dd"</span> ) <span class="indent"> </span><span class="keyword" style="font-weight: bold;">private</span> Date birthday; <span class="indent"> </span><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">//setterAndGetter</span> }
至此,不要以为完事大吉了,你还需要完成以下两个步骤才可以。
第一需要加入 joda 的 jar 包。因为在 @DateTimeFormat 注解中使用到了 joda 包中的相关东西,所以缺少这个包也是会报异常的。如果使用的直接导入 jar 包的话,去下载 joda-Jar 导入即可,如果使用的是 Maven 管理项目的 jar ,那么在配置文件文件中加入依赖:
<span class="tag" style="color: rgb(0, 0, 128);"><<span class="title">dependency</span>></span> <span class="tag" style="color: rgb(0, 0, 128);"><<span class="title">groupId</span>></span>joda-time<span class="tag" style="color: rgb(0, 0, 128);"></<span class="title">groupId</span>></span> <span class="tag" style="color: rgb(0, 0, 128);"><<span class="title">artifactId</span>></span>joda-time<span class="tag" style="color: rgb(0, 0, 128);"></<span class="title">artifactId</span>></span> <span class="tag" style="color: rgb(0, 0, 128);"><<span class="title">version</span>></span>2.3<span class="tag" style="color: rgb(0, 0, 128);"></<span class="title">version</span>></span> <span class="tag" style="color: rgb(0, 0, 128);"></<span class="title">dependency</span>></span>
第二需要在 SpringMVC 配置 xml 文件中(一般是 dispatchServlet.xml 文件)中加入配置: <mvc:annotation-driven /> 。这一句配置是一种简写,其实是给 Spring 容器中注入了两个 Bena ,分别是: DefaultAnnotationHandlerMapping 和AnnotationMethodHandlerAdapter 。 @DateTimeFormat 注解的内部同样需要使用到前面注入的两个 bean 去处理,所以缺少这个配置, Spring 容器中没有对应的 bean 去处理注解同样也会报错。至此,所有的步骤都完成了,可以跑了。
接下来我们跑跑测试一下,测试过程:
首先需要一个表单 :
<span class="tag" style="color: rgb(0, 0, 128);"><<span class="title">form</span> <span class="attribute" style="color: rgb(0, 128, 128);">action</span>=<span class="value" style="color: rgb(221, 17, 68);">"test"</span> <span class="attribute" style="color: rgb(0, 128, 128);">method</span>=<span class="value" style="color: rgb(221, 17, 68);">"post"</span>></span> <span class="tag" style="color: rgb(0, 0, 128);"><<span class="title">input</span> <span class="attribute" style="color: rgb(0, 128, 128);">type</span>=<span class="value" style="color: rgb(221, 17, 68);">"text"</span> <span class="attribute" style="color: rgb(0, 128, 128);">name</span>=<span class="value" style="color: rgb(221, 17, 68);">"name"</span>></span> <span class="tag" style="color: rgb(0, 0, 128);"><<span class="title">input</span> <span class="attribute" style="color: rgb(0, 128, 128);">type</span>=<span class="value" style="color: rgb(221, 17, 68);">"text"</span> <span class="attribute" style="color: rgb(0, 128, 128);">name</span>=<span class="value" style="color: rgb(221, 17, 68);">"birthday"</span>></span> <span class="tag" style="color: rgb(0, 0, 128);"><<span class="title">input</span> <span class="attribute" style="color: rgb(0, 128, 128);">type</span>=<span class="value" style="color: rgb(221, 17, 68);">"submit"</span> <span class="attribute" style="color: rgb(0, 128, 128);">name</span>=<span class="value" style="color: rgb(221, 17, 68);">"提交"</span>></span> <span class="tag" style="color: rgb(0, 0, 128);"></<span class="title">form</span>></span>
用一个 Controller 接收:
<span class="annotation">@RequestMapping</span>( <span class="string" style="color: rgb(221, 17, 68);">"/test"</span> ) <span class="keyword" style="font-weight: bold;">public</span> ModelAndView test(HttpServletRequest request, <span class="indent"> </span> <span class="annotation">@ModelAttribute</span> Person person) { <span class="indent"> </span>ModelAndView view = <span class="keyword" style="font-weight: bold;">new</span> ModelAndView(); <span class="indent"> </span>System.out.println(person.toString()); <span class="indent"> </span>view.setViewName(<span class="string" style="color: rgb(221, 17, 68);">"/test/data"</span>); <span class="indent"> </span><span class="keyword" style="font-weight: bold;">return</span> view; }
好了,总结一下整个过程,其实就 3 步:
1 、 在 Date 类型的属性上加入 @DateTimeFormat 注解
2、 加入 joda 相关的包
3、 在 SpringMVC 配置文件中加入 <mvc:annotation-driven />
相关文章推荐
- Java数据类型与各数据库类型映射
- 数据库与java类型映射
- 数据库与java类型映射
- 数据库类型与java类型关系映射
- Java数据类型与各数据库类型映射一览表
- Hibernate映射类型、对应的Java时间和日期类型及对应的标准SQL类型
- Java数据类型与各数据库类型映射一览表
- Java数据类型与各数据库类型映射一览表
- Java时间和日期类型的Hibernate映射类型
- hibernate Java 时间和日期类型的 Hibernate 映射
- hibernate Java 时间和日期类型的 Hibernate 映射
- JavaWeb---过滤器的使用--禁止IP登陆
- Java时间和日期类型的Hibernate映射类型
- JDBC:数据库自定义类型与Java类的映射—将对象存储在关系数据库中(一)
- JDBC:数据库自定义类型与Java类的映射—将对象存储在关系数据库中(二)
- JDBC:Java数组和数据库中Array类型的映射
- JDBC:Java中枚举类型和PostgreSQL数据库中枚举类型的映射
- Hibernate-2映射 Java 的时间, 日期类型
- Java web----时间类型
- 1007--Java 时间和日期类型的 Hibernate 映射