包目录视图
领域模型层User.java
package com.xuzengqiang.project.domain;
public class User
{
private String username;
private String password;
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
}
Index.java用于首页跳转,访问WEB-INF下面的index.jsp页面
package com.xuzengqiang.project.struts2.action;
import com.opensymphony.xwork2.ActionSupport;
@SuppressWarnings("serial")
public class IndexAction extends ActionSupport
{
public String execute() throws Exception
{
return "success";
}
}
UserAction.java用于登录跳转
package com.xuzengqiang.project.struts2.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport
{
private static final long serialVersionUID = 3252129927051594877L;
private String username;
private String password;
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
public String login() throws Exception
{
String username=getUsername();
String password=getPassword();
if("xuzengqiang".equals(username) && "123".equals(password))
{
HttpServletRequest request=ServletActionContext.getRequest();
HttpSession session=request.getSession();
session.setAttribute("username", username);
return "user_login_success";
}
return "user_login_failure";
}
}
CssLink.java,需继承UIBean。
package com.xuzengqiang.project.view.component;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.components.UIBean;
import com.opensymphony.xwork2.util.ValueStack;
@SuppressWarnings("all")
public class CssLink extends UIBean
{
private String sourcePath="";
private String templateName="csslink.ftl";
public String getSourcePath()
{
return sourcePath;
}
public void setSourcePath(String sourcePath)
{
this.sourcePath=sourcePath;
}
public String getTemplateName()
{
return templateName;
}
public void setTemplateName(String templateName)
{
this.templateName=templateName;
}
public CssLink(ValueStack stack, HttpServletRequest request, HttpServletResponse response)
{
super(stack, request, response);
}
@Override
protected Object findValue(String expr, Class toType)
{
if(null !=expr)
{
return super.findValue(expr, toType);
}
return null;
}
@Override
protected void evaluateExtraParams()
{
super.evaluateExtraParams(); //添加参数,在freemarker的模板中就可以使用${parameters.sourcePath}获取路径了
if(sourcePath!=null)
{
addParameter("sourcePath", findValue(getSourcePath() , String.class));
}
}
//返回模板名称
@Override
protected String getDefaultTemplate()
{
return templateName;
}
}
CssLinkTag.java,需继承ComponentTagSupport类
package com.xuzengqiang.project.view.tag;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.components.Component;
import org.apache.struts2.views.jsp.ComponentTagSupport;
import com.opensymphony.xwork2.util.ValueStack;
import com.xuzengqiang.project.view.component.CssLink;
//fm:cssLink 用作css样式的链接
public class CssLinkTag extends ComponentTagSupport
{
private static final long serialVersionUID = 5431625114311564858L;
private String sourcePath = "";
public String getSourcePath()
{
return sourcePath;
}
public void setSourcePath(String sourcePath)
{
this.sourcePath = sourcePath;
}
@Override
public Component getBean(ValueStack valStack, HttpServletRequest request, HttpServletResponse response)
{
return new CssLink(valStack, request, response);
}
@Override
/*
* 参数的初始化
*/
protected void populateParams()
{
super.populateParams();
CssLink cssLink = (CssLink) component;
cssLink.setSourcePath(getSourcePath());
}
}
csslink.ftl
<link rel="stylesheet" type="text/css" href="${parameters.sourcePath}"/>
framework-tag.tld,拷贝struts2-core-....jar包目录下的META-INF下的struts-tags然后重命名即可。
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="2.0"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">
<display-name>Framework Tags</display-name>
<tlib-version>2.3</tlib-version>
<short-name>fm</short-name>
<uri>/framework-tags</uri>
<tag>
<description><![CDATA[struts2结合freemarker自定义标签]]></description>
<name>cssLink</name>
<tag-class>com.xuzengqiang.project.view.tag.CssLinkTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>sourcePath</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<dynamic-attributes>false</dynamic-attributes>
</tag>
</taglib>
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<package name="index" extends="struts-default">
<action name="index" class="com.xuzengqiang.project.struts2.action.IndexAction">
<result name="success">/WEB-INF/index.jsp</result>
</action>
</package>
<package name="user" extends="struts-default">
<action name="user" class="com.xuzengqiang.project.struts2.action.UserAction">
<result name="user_login_success">/WEB-INF/success.jsp</result>
<result name="user_login_failure">/WEB-INF/index.jsp</result>
</action>
</package>
</struts>
index.jsp,使用的时候需要加上<@taglib prefix="fm" uri="/framework-tags" %>,调用的时候使用<fm:cssLink 属性1>即可。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="fm" uri="/framework-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<fm:cssLink sourcePath="/ProjectTest/css/index.css" />
<title>测试用例</title>
</head>
<body>
<div class="content">
<div class="login">
<form action="${pageContext.request.contextPath}/user!login" method="post">
账号:<input type="text" name="username"/><br/>
姓名:<input type="text" name="password"/><br/>
<input type="submit" value="登录"/>
</form>
</div>
</div>
</body>
</html>
web.xml,如果要将配置文件struts.xml放入到WEB-INF下面的某个目录下面,可以在过滤器StrutsPreparedAndExecuteFilter中配置config参数。
<?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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>ProjectTest</display-name>
<filter>
<filter-name>strutsPrepareAndExecuteFilter</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>config</param-name>
<param-value>
struts-default.xml,
struts-plugin.xml,
../configuration/struts.xml
</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>strutsPrepareAndExecuteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>