您的位置:首页 > 编程语言 > Java开发

[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中一个传入一个传出

@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 />
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: