Saturday, December 6, 2014

Whitespace trimming in Struts2 using filter

Source link: https://app.box.com/s/j7sji6xhn1sc26rayosi
  • Create a filter for trimming
  • Add the filter to web.xml

1. Create filter for trimming

When you use the struts2 filter org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter  use should create a Request wrapper extend StrutsRequestWrapper
The full WhitespaceFilter class:
 package com.vmtram.struts2.filters;  
 import java.io.IOException;  
 import java.util.HashMap;  
 import java.util.Iterator;  
 import java.util.Map;  
 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.apache.struts2.dispatcher.StrutsRequestWrapper;  
 public class WhitespaceFilter implements Filter {  
      public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException,  
                ServletException {  
           HttpServletRequest request = (HttpServletRequest) req;  
           chain.doFilter(new RequestWrapper(request), res);  
      }  
      @Override  
      public void destroy() {  
      }  
      @Override  
      public void init(FilterConfig arg0) throws ServletException {  
      }  
      class RequestWrapper extends StrutsRequestWrapper {  
           public RequestWrapper(HttpServletRequest request) {  
                super(request);  
           }  
           @Override  
           public Map<String, String[]> getParameterMap() {  
                Map<String, String[]> paramMapIn = super.getParameterMap();  
                Map<String, String[]> paramMapOut = new HashMap<String, String[]>();  
                Iterator<String> keys = paramMapIn.keySet().iterator();  
                while (keys.hasNext()) {  
                     String key = keys.next();  
                     String[] values = paramMapIn.get(key);  
                     if (values.length == 1) {  
                          String value = values[0].trim();  
                          paramMapOut.put(key, new String[] { value });  
                     } else {  
                          paramMapOut.put(key, values);  
                     }  
                }  
                return paramMapOut;  
           }  
      }  
 }  

Because the implement doFilter of StrutsPrepareAndExecuteFilter  will make a wrapRequest for input ServletRequest.
 ...  
         prepare.setEncodingAndLocale(request, response);  
         prepare.createActionContext(request, response);  
         prepare.assignDispatcherToThread();  
         request = prepare.wrapRequest(request);  
         ActionMapping mapping = prepare.findActionMapping(request, response, true);  
 ...  

Have a checking in the implememt of wrapRequest
  if (request instanceof StrutsRequestWrapper) {  
       return request;  
     }  

If RequestWrapper of user extends HttpServletRequestWrapper it cannot invoke to user getParameterMap() method to trim() the  parameters.

2. Add filter to web.xml

     <filter>  
           <filter-name>whitespaceFilter</filter-name>  
           <filter-class>com.vmtram.struts2.filters.WhitespaceFilter</filter-class>  
      </filter>  
      <filter-mapping>  
           <filter-name>whitespaceFilter</filter-name>  
           <url-pattern>/*</url-pattern>  
      </filter-mapping>  

The results:

Relate: 


  • Create Struts2 project with eclipse and maven
  • Support UTF-8 in java web

  • Support UTF-8 in Struts2 using filter

    This charset filter can apply for many Java web like JSF, Struts, Struts2, JSP ...

    Source linkhttps://app.box.com/s/s8ldu549lt3jt1ppvxs7
    • Create a charset filter
    • Add filter to web.xml
    • Enable encoding UTF-8 in view

    1. Create a filter to support UTF-8:

     package com.vmtram.struts2.filters;  
     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;  
     public class CharsetFilter implements Filter {  
          @Override  
          public void destroy() {  
          }  
          @Override  
          public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException,  
                    ServletException {  
               req.setCharacterEncoding("UTF-8");  
               res.setContentType("text/html; charset=UTF-8");  
               chain.doFilter(req, res);  
          }  
          @Override  
          public void init(FilterConfig arg0) throws ServletException {  
          }  
     }
    

    2. Add filter to web.xml

          <filter>  
               <filter-name>charsetFilter</filter-name>  
               <filter-class>com.vmtram.struts2.filters.CharsetFilter</filter-class>  
          </filter>  
          <filter-mapping>  
               <filter-name>charsetFilter</filter-name>  
               <url-pattern>/*</url-pattern>  
          </filter-mapping>  
    

    3. Enable encoding UTF-8 in view. 

    Such as in JSP file.
     <%@ page language="java" contentType="text/html; charset=UTF-8"  
          pageEncoding="ISO-8859-1"%>  
    


    The results:










    Related:



    Create Struts2 project with eclipse and maven

    • Create a Struts2 project with eclipse
    • Convert to maven project
    • First HelloStruts2 example

    1. Create a Dynamic Web Project with eclipse Kepler:

    Eclipse -> new project -> select Dynamic Web Project -> enter Project name (HelloStruts2) -> select Next -> select Generate web.xml and click finish.

    Add struts.xml to folder /WEB-INF/classes. Create folder /classes if it does not existed.
     <?xml version="1.0" encoding="UTF-8"?>  
     <!DOCTYPE struts PUBLIC  
       "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
       "http://struts.apache.org/dtds/struts-2.0.dtd">  
     <struts>  
          <constant name="struts.devMode" value="true" />  
     </struts>  
    

    Add the filter StrutsPrepareAndExecuteFilter to web.xml as the below:
     <?xml version="1.0" encoding="UTF-8"?>  
     <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">  
      <display-name>HelloStruts2</display-name>  
      <display-name>Struts2 with eclipse and maven</display-name>  
          <welcome-file-list>  
               <welcome-file>pages/index.jsp</welcome-file>  
          </welcome-file-list>  
          <filter>  
               <filter-name>struts2</filter-name>  
               <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  
          </filter>  
          <filter-mapping>  
               <filter-name>struts2</filter-name>  
               <url-pattern>/*</url-pattern>  
          </filter-mapping>  
     </web-app>  
    

    2. Convert to maven project:

    Right click on project -> Configure -> Convert to Maven Project.

    Add dependency for struts2 in pom.xml:
     <dependency>   
             <groupId>org.apache.struts</groupId>   
             <artifactId>struts2-core</artifactId>   
             <version>2.3.16.3</version>   
        </dependency>   
    

    3. First HelloStruts2 example

    Create HelloAction.java

     package com.vmtram.struts2.action;  
     public class HelloAction {  
          private static final String SUCCESS = "SUCCESS";  
          private String username;  
          public String doAction() {  
               return SUCCESS;  
          }  
          // Getter & Setter  
          public String getUsername() {  
               return username;  
          }  
          public void setUsername(String username) {  
               this.username = username;  
          }  
     }  

    Mapping the action in struts.xml
     <?xml version="1.0" encoding="UTF-8"?>  
     <!DOCTYPE struts PUBLIC  
       "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
       "http://struts.apache.org/dtds/struts-2.0.dtd">  
     <struts>  
          <constant name="struts.devMode" value="true" />  
          <package name="helloWorld" extends="struts-default">  
               <action name="hello" class="com.vmtram.struts2.action.HelloAction"  
                    method="doAction">  
                    <result name="SUCCESS">/pages/hello-view.jsp</result>  
               </action>  
          </package>  
     </struts>  
    

    Create a view index.jsp to input data
     <%@ page language="java" contentType="text/html; charset=UTF-8"  
          pageEncoding="ISO-8859-1"%>  
     <%@ taglib prefix="s" uri="/struts-tags"%>  
     <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
     <html>  
     <head>  
     <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">  
     <title>Index</title>  
     </head>  
     <body>  
          <s:form action="hello">  
               <s:textfield name="username" label="Enter your name" />  
               <s:submit value="SUBMIT" />  
          </s:form>  
     </body>  
     </html>  
    

    Create a view hello-view.jsp to show data
     <%@ page language="java" contentType="text/html; charset=UTF-8"  
          pageEncoding="UTF-8"%>  
     <%@ taglib prefix="s" uri="/struts-tags"%>  
     <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
     <html>  
     <head>  
     <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">  
     <title>Hello view</title>  
     </head>  
     <body>  
          Hello  
          <s:property value="username" />  
     </body>  
     </html>  

    The project structure:

    The result:

    Related: