学习struts2步骤:
1.先在慕课网上找了struts2相关的视频看完,视频:struts2拦截器浅析
2.根据视频讲解,做了登录验证,(看了视频,能对struts2的功能作用有一定的了解)
3.写了些strut2的示例,加强理解
需要:tomcat ,maven提前配好,使用的是eclipse开发工具
struts2:新建maven项目--配置pom.xml--配置web.xml--配置struts.xml,log4j.properties--java代码--jsp代码
maven运行配置:
Goals:tomcat7:run
Profiles:strutsProject
项目名:strutsProject
配置文件:
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>strutsProject</groupId> <artifactId>strutsProject</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>strutsProject Maven Webapp</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> <struts2.version>2.5.14.1</struts2.version> <jstl-version>1.2</jstl-version> </properties> <dependencies> <!-- Junit依赖 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- struts2核心jar包 --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>${struts2.version}</version> </dependency> <!--action使用 EL表达式 --> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>${jstl-version}</version> </dependency> <!-- log4j 日志 --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.7.10</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.10</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.10</version> </dependency> </dependencies> <build> <finalName>strutsProject</finalName> <plugins> <!-- 统一源代码编译输出的JDK版本 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin> <!-- 打包时跳过单元测试 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.19.1</version> <configuration> <skipTests>true</skipTests> </configuration> </plugin> <!-- 集成Tomcat插件 --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <path>/${project.artifactId}</path> </configuration> </plugin> </plugins> </build> </project>
web.xml:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>strutsProject</display-name>
<welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list>
<!-- 配置StrutsPrepareAndExecuteFilter核心控制器 --> <filter> <!-- 过滤器名 --> <filter-name>struts2</filter-name> <!-- StrutsPrepareAndExecuteFilter核心控制器的实现类 --> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <!-- 过滤器名 --> <filter-name>struts2</filter-name> <!-- 过滤器过滤所有请求 --> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
struts.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <!-- 指定访问Struts2的后缀,默认是action --> <constant name="struts.action.extension" value="action"/> <constant name="struts.enable.DynamicMethodInvocation" value="false"></constant> <!-- 开发者模式关闭 -->
<constant name="struts.devMode" value="false" /> <!--因为登录和访问权限拦截是全局的, 拦截返回的结果有些也是全局的 ,定义了自己的package以便引用 --> <package name="struts-my" extends="struts-default"> <!-- 注册拦截器 --> <interceptors > <!--判断是否有登录和访问权限 --> <interceptor name="auth" class="org.struts.action.AuthInterceptor"></interceptor> <!--自定义拦截器栈 mystack --> <interceptor-stack name="mystack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="auth"></interceptor-ref> </interceptor-stack> </interceptors> <!-- 拦截返回的结果有些也是全局的 --> <default-interceptor-ref name="mystack"></default-interceptor-ref> <!-- 全局结果 --> <global-results> <!-- 拦截没登录返回结果 --> <result name="login" type="redirect">/login.jsp</result> <!-- 拦截没有权限返回结果 --> <result name="noPower" type="redirect">/no_power.jsp</result> </global-results> </package>
<!-- 以下action 是一些示例调用需要访问的 --> <package name="project" namespace="/" extends="struts-my" > <action name="index"> <result>/index.jsp</result> </action> <action name="hello" class="org.struts.action.HelloeWorldAction" method="execute"> <result>/register.jsp</result> </action> <action name="resigter" class="org.struts.action.ResigterAction" method="execute"> <result>/helloWorld.jsp</result> </action> <!-- 登录不需要拦截(或者其它不需要拦截的) 让它们的拦截器继承defaultStack 局部权限高于全局定义的,它们的拦截器栈就是默认的,不是自定义的。 --> <action name="login" class="org.struts.action.LoginAction" method="login"> <result>/WEB-INF/manager.jsp</result> <result name="error">/login.jsp</result> <interceptor-ref name="defaultStack"></interceptor-ref> </action> <!-- 通过 此Action访问后台管理页面,需要判断用户是否已登录,如果未登录,则跳转到登录页面--> <action name="auth" > <result >/WEB-INF/manager.jsp</result> <result name="login" >/login.jsp</result> <!-- 应用自定义的拦截器栈 --> <interceptor-ref name="mystack"></interceptor-ref> </action> <action name="methods_*" class="org.struts.action.MethodCheck" method="{1}"> <result name="save">/Check.jsp</result> <result name="update">/Check.jsp</result> <result name="modify">/Check.jsp</result> <result name="input">/methodSubmit.jsp</result> <!-- struts2.3以后,需要调用的方法,都要配置一下 --> <allowed-methods>save,update,modify</allowed-methods> </action> <action name="demo" class="org.struts.action.DemoAction" > <result name="demo">/demo.jsp</result> </action> <action name="book" class="org.struts.bookaction.BookAction" method="execute"> <result name="books">/books.jsp</result> </action> <action name="test" class="org.struts.bookaction.TestAction" method="execute"> <result name="test">/test.jsp</result> </action> </package> </struts>
log4j.properties
### set log levels - for more verbose logging change 'info' to 'debug' ### #log4j.rootLogger= DEBUG,stdout log4j.rootLogger= ERROR ### direct log messages to stdout ### log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n # MyBatis logging configuration... #log4j.logger.net.cxp.blog.dao=DEBUG,CONSOLE,ERROR #sql log4j.logger.com.ibatis=DEBUG log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG log4j.logger.org.mybatis=DEBUG log4j.logger.java.sql.Connection=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG log4j.logger.java.sql.ResultSet=DEBUG ### direct messages to file mylog.log ### log4j.appender.file=org.apache.log4j.DailyRollingFileAppender log4j.appender.file.File=D:\log4j\king\basiscrm.log log4j.appender.file.File=../log4j/king/basiscrm.log log4j.appender.file.DatePattern='_'yyyy-MM-dd'.log' log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.Append = true ## u8F93u51FADEBUGu7EA7u522Bu4EE5u4E0Au7684u65E5u5FD7 log4j.appender.file.Threshold = info,DEBUG,CONSOLE ## log4j.appender.file.Threshold = info,DEBUG,CONSOLE,ERROR log4j.appender.file.layout.ConversionPattern=%n%-d{MM-dd HH:mm:ss}-%C.%M()%n[%p]%m%n log4j.logger.com.ibatis=DEBUG #debug log log4j.appender.DEBUG = org.apache.log4j.DailyRollingFileAppender log4j.appender.DEBUG.File = ../log4j/king/debug/debug.log log4j.appender.DEBUG.DatePattern='_'yyyy-MM-dd'.log' log4j.appender.DEBUG.Append = true log4j.appender.DEBUG.Threshold = DEBUG log4j.appender.DEBUG.layout = org.apache.log4j.PatternLayout log4j.appender.DEBUG.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n #error log log4j.appender.D = org.apache.log4j.DailyRollingFileAppender log4j.appender.D.File = ../log4j/king/error/error.log log4j.appender.D.File.DatePattern='_'yyyy-MM-dd'.log' log4j.appender.D.Append = true log4j.appender.D.Threshold = ERROR log4j.appender.D.layout = org.apache.log4j.PatternLayout log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n </Configuration>
package org.struts.action; import java.util.Map; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
//自定义拦截器 public class AuthInterceptor extends AbstractInterceptor { @Override public String intercept(ActionInvocation invocation) throws Exception { //通过下上文获取到session Map<String,Object> session=ActionContext.getContext().getSession(); if(session.get("loginInfo")!=null){//继续执行不拦截 String result=invocation.invoke(); return result; }else{ return "login"; } } }
package org.struts.action; import java.util.Map; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; /** 主要是为了验证Action作用域 */ public class DemoAction extends ActionSupport{ private Map<String,Object> request; private Map<String,Object> session; private Map<String,Object> application; public DemoAction(){ request=(Map<String, Object>) ActionContext.getContext().get("request"); session=ActionContext.getContext().getSession(); application=ActionContext.getContext().getApplication(); } public String execute(){ request.put("req", "req111"); session.put("sess", "sess222"); application.put("app", "app333"); return "demo"; } }
package org.struts.action; import org.struts.model.MessageStore; import com.opensymphony.xwork2.ActionSupport; public class HelloeWorldAction extends ActionSupport { private MessageStore messageStore; public String execute(){ messageStore=new MessageStore(); return SUCCESS; } public MessageStore getMessageStore(){ return messageStore; } }
package org.struts.action; import java.util.Map; import org.apache.struts2.interceptor.SessionAware; import com.opensymphony.xwork2.ActionSupport; /** * map怎么拿到的呢?通过实现接口SessionAware * @author lin.luo02 * */ public class LoginAction extends ActionSupport implements SessionAware{ private String username; private String password; private Map<String ,Object> session; @Override public void setSession(Map<String, Object> session) { this.session=session; } //处理登录请求 public String login(){ if("admin".equals(username)&& "123".equals(password)){ session.put("loginInfo", username); return SUCCESS; }else{ session.put("loginError", "用户名或者密码不正确"); return ERROR; } } 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; } }
package org.struts.action; import com.opensymphony.xwork2.ActionSupport; /* * validate,在调用方法之前进行验证 */ public class MethodCheck extends ActionSupport{ private String name; private String sex; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String modify(){ System.out.println("method modify......"); return "modify"; } public String save(){ System.out.println("method save......"); return "save"; } public String update(){ System.out.println("method update......"); return "update"; } /** * 数据验证 */ public void validateUpdate() { System.out.println("name:"+name+",sex:"+sex); if(this.name==null ||"".equals(this.name)){ this.addFieldError("nameError", "姓名不能为空"); } if(this.sex==null ||"".equals(this.sex)){ this.addFieldError("sexError", "性别不能为空"); } } }
package org.struts.action; import org.struts.model.Resigter; import com.opensymphony.xwork2.ActionSupport; public class ResigterAction extends ActionSupport { private Resigter resigter; public Resigter getResigter() { System.out.println(111); return resigter; } public void setResigter(Resigter resigter) { System.out.println(222); this.resigter = resigter; } public String execute(){ System.out.println(resigter.getPassword()+","+resigter.getUseraccount()); return SUCCESS; } }
package org.struts.bookaction; import java.util.LinkedList; import java.util.List; import org.struts.model.Book; import com.opensymphony.xwork2.ActionSupport; public class BookAction extends ActionSupport{ private List<Book> booklist; public List<Book> getBooklist() { return booklist; } public void setBooklist(List<Book> booklist) { this.booklist = booklist; } public String execute(){ booklist=new LinkedList<Book>(); booklist.add(new Book("html5","lin",58.6)); booklist.add(new Book("css3","jac",60.5)); return "books"; } }
package org.struts.bookaction; import com.opensymphony.xwork2.ActionContext; public class TestAction { private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public String execute(){ ActionContext ac=ActionContext.getContext(); ac.put("name", "007"); return "test"; } }
package org.struts.model; public class Book { private String title; private String author; private double price; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public Book(String title, String author, double price) { super(); this.title = title; this.author = author; this.price = price; } public Book() { super(); } }
package org.struts.model; public class MessageStore { private String message; public void setMessage(String message) { this.message = message; } public MessageStore() { message = "Hello Struts User"; } public String getMessage() { return message; } }
package org.struts.model; public class Resigter { private String useraccount; private String password; public String getUseraccount() { return useraccount; } public void setUseraccount(String useraccount) { this.useraccount = useraccount; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Resigter(String useraccount, String password) { super(); this.useraccount = useraccount; this.password = password; } public Resigter() { } }
jsp 页面代码
books.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ taglib uri="/struts-tags" prefix="s"%> <!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=UTF-8"> <title>books 集合显示</title> </head> <body> <p>EL</p> <c:forEach items="${booklist}" varStatus="i" var="item"> <p>书名:${item.title }</p> <p>作者:${item.author }</p> <p>价格:${item.price }</p> <hr/> </c:forEach> <br><br/> <p>ONGL</p> <s:iterator value="booklist.{?#this.price > 35}"> <s:property value="title" /> - $<s:property value="price" /> <br> </s:iterator> </body> </html>
Check.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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=UTF-8"> <title>Insert title here</title> </head> <body> 通过验证方法到达页面 </body> </html>
demo.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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=UTF-8"> <title>action四大作用域</title> </head> <body> ${req } <br> ${sess } <br> ${app } </body> </html>
helloWorld.jsp
<!DOCTYPE html> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Hello World!</title> </head> <body> <!-- taglib指令告诉Servlet容器该页面将使用Struts2标签,并且这些标签前面会有一个s。 s:property 标签显示通过调用方法返回的值getMessageStore 的的HelloWorldAction 控制器类。该方法返回一个MessageStore 对象。 通过将.message 值添加到value属性的messageStore部分,我们告诉Struts 2框架调用该 对象的getMessage 方法MessageStore。 getMessage 类的方法MessageStore返回一个String。它是由s:property 标签显示的字符串。 <h2><s:property value="messageStore.message" /></h2> --> <p> 您的用户名为:<s:property value="resigter.useraccount"/> </p> <p> 您的密码为:<s:property value="resigter.password"/> </p> </body> </html>
index.jsp
<!DOCTYPE html> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>StrutsProject Application - Welcome</title> </head> <body> <h1>Welcome To Struts 2!</h1> <p><a href="<s:url action='project/hello'/>">Hello World</a></p> ${req } <br> ${sess } <br> ${app } </body> </html>
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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=UTF-8"> <title>Insert title here</title> </head> <body> <h2>用户登录</h2> ${loginError} <form action="login.action" method="post"> 用户名:<input type="text" name="username"> 密码:<input type="password" name="password"> <input type="submit" name="登录"> </form> </body> </html>
methodSubmit.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <!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=UTF-8"> <title>Insert title here</title> </head> <body> <h2>验证方法过滤</h2> <form action="${pageContext.request.contextPath}/methods_update.action" method="post"> 用户名:<input type="text" name="name"><s:fielderror fieldName="nameError"/><br/> 性别:<input type="text" name="sex"><s:fielderror fieldName="sexError"/><br/> <input type="submit" name="提交"> </form> </body> </html>
register.jsp
<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>用户注册</title> </head> <body> <form action="resigter.action" method="post"> username:<input type="text" name="resigter.useraccount"/><br/> password:<input type="password" name="resigter.password"/><br/> <input type="submit" value="注册"/><br/> </form> </body> </html>
test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>TestAction 字段显示</title>
</head>
<body>
<p>消息:${message }</p>
<p>名字:${name }</p>
</body>
</html>
以上是关于一些struts2的示例,没有登录,访问文件时会跳转到:login.jsp页面,
http://localhost:8080/strutsProject/login.jsp