strut2学习笔记

学习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

原文地址:https://www.cnblogs.com/cjxns/p/11209415.html