Struts2

Posted lxrm的博客空间

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts2相关的知识,希望对你有一定的参考价值。

Struts2

一、概述:

  • struts2把Servlet、JSP、自定义标签、JSP标准标签库、信息资源全部整合起来了
  • 且已经实现了MVC开发模式。
  • 基于Struts2开发web project比原生开发有许多好处:
    • 1)开发人员如果基于Struts2进行web project的开发,就不用像原生开发那样,还得自己去实现MVC开发模式,自己去集成相应的servlet、jstl标签库的jar包到自己的project中,只需要引入Struts2的相应jar包,就可以直接使用其servlet API、标准标签库中的jsp标签了。
    • 2)struts2框架中除了集成了上述servlet、标签库等等,还扩展了另外一部分功能,也从极大程度上方便web project程序的开发,加快开发进程。这些功能包括:前端拦截器、运行时表单属性验证、类型转换、OGNL表达式语言、IoC容器。
    • 3)除了支持JSP之外,还支持FreeMarker、Velocity等表现层技术
    • 4)Struts2中的Action和Servlet实现了松耦合,使得Action更像一个普通的java对象,该控制器代码中没有耦合任何的Servlet API,这也使单元测试变得更加方便。

二、编程思路

  • step1,下载Struts2开发包
      • 网址:http://struts.apache.org
      • 有多种版本可供选择,建议下载FullDistribution版
      • 解压下载所得压缩包,可以看到apps/docs/lib/src等文件夹,分别存放着使用Struts2的示例程序、相关文档、Struts2核心类库以及所依赖的三方类库、Struts2框架的所有源代码。 
  • step2,安装Struts2开发包至你的project中
      • 解压step1下载所得压缩包
      • 获取其lib文件夹下的jar包,将其复制粘贴至project的WEB-INF/lib/目录下
        •  
  • step3,在project的web.xml中配置Struts2的核心控制器,用来拦截客户请求

        •   <filter>
              <filter-name>struts2</filter-name>
              <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
              <init-param>
                  <param-name>struts.i18n.encoding</param-name>
                  <param-value>UTF-8</param-value>
              </init-param>
            </filter>
            <filter-mapping>
              <filter-name>struts2</filter-name>
              <url-pattern>*.action</url-pattern>
            </filter-mapping>
            <filter-mapping>
              <filter-name>struts2</filter-name>
              <url-pattern>*.jsp</url-pattern>
            </filter-mapping>
            <!-- 添加下面这行的目的是使程序可以使用struts2中的内置类型转换器实现简单类型转换 -->
            <filter-mapping>
                <filter-name>struts2</filter-name>
                <url-pattern>/struts/*</url-pattern>
            </filter-mapping>
  • step4,经过上述步骤,Struts2已经集成到你的project中了,下面就可以基于Struts2所提供的各种功能为你的web project添加各个功能模块
  • 例一,为你的web project添加用户登录模块
    •   功能  
      login.jsp 用户登录页面,可以输入用户名和密码  
      LoginAction.java 用于处理用户的“登录请求”,并且根据请求参数返回相应的结果  
           
           
           
        
  • step5,创建视图页面 login.jsp

        • <%@ page language="java" pageEncoding="UTF-8"%>
          
          <%@ taglib prefix="s" uri="/struts-tags"%>
          <font color="red" style="font-size:12px">
              <s:property value="#session.errorMsg_login"/><br><!-- 显示错误信息:LoginInterceptor.java返回的错误信息 -->
              <!-- 客户访问权限受限资源时,都会先将请求交给limittedResources.action进行处理,
              该action中引入了自定义拦截器loginInterceptor,该拦截器会判断用户是否是已登录用户,
              若是,则继续执行下面的拦截器或action,否则就将错误信息保存在session范围的Map集合中,key="errorMsg",并且跳转至登录页面login.jsp -->
              <s:property value="#session.errorMsg_null"/><br><!-- 显示错误信息:LoginAction.java返回的错误信息 -->
              <s:property value="#session.errorMsg_passwprd"/><br><!-- 用户名存在但是输入的密码不正确则显示此信息,该错误信息来自于LoginAction -->
              <s:property value="#session.errorMsg_username"/><br><!-- 用户名不存在时显示此信息,该错误信息来自于LoginAction -->
          </font>
          <s:form action="login_execute" method="post" namespace="/">
              <s:textfield name="user.username" label="用户名" title="请填写用户名,注意大小写" cssStyle="width:160px;height:26px;"/>
              <s:password name="user.password" label="密码" title="请填写密码,注意大小写" cssStyle="width:160px;height:26px;"></s:password>
              <s:submit value="登陆"></s:submit>
          </s:form>  
  • step6,创建业务控制器类LoginAction.java

        • /*
           * author:lxrm
           * date:2016/05
           * @function execute():用户登录,
           *         login.jsp中会触发该action,useraction.execute.action
           *         LoginAction-validation.xml文件来验证用户输入的数据是否合法(文件名:action名称-validation.xml;存放位置:放在对应action的同级目录下)
           * @function register():用户注册
           *             
           * */
          package lxrm.struts2demo.actions;
          import  lxrm.struts2demo.javabeans.User;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpSession;
          
          import org.apache.struts2.ServletActionContext;
          
          import com.opensymphony.xwork2.ActionSupport;
          
          public class LoginAction extends ActionSupport {
          
              private User user;
              @Override
              public String execute() throws Exception {
                  /*将username存放成session范围的属性,
                   * 这样就可以通过使用LoginInterceptor拦截器判断session范围内是否有username属性来
                   * 来得出用户是否已经登录的判断结果*/
                  HttpServletRequest request=ServletActionContext.getRequest();
                  HttpSession session=request.getSession();
                  if(user.getUsername()!=null&&!user.getUsername().equals("")){
                      session.setAttribute("username", user.getUsername());
                  }else{
                      session.setAttribute("errorMsg_null", "用户名不能为空");
                  }
                  if(user.getUsername().equals("lxrm")){
                      if(user.getPassword().equals("1")){
                          return SUCCESS;
                      }else{
                          session.setAttribute("errorMsg_password", "密码不正确,注意大小写");
                          return INPUT;
                      }            
                  }else{
                      session.setAttribute("errorMsg_username", "不存在的用户名");
                      return INPUT;
                  }
              }
              /*
               * 和execute相似的逻辑处理函数,返回注册页面作为视图页面*/
              public String register(){
                  return "regist";
              }
              public void setUser(User user){
                  this.user=user;
              }
              public User getUser(){
                  return this.user;
              }
          }
  • step7,在src目录下新建struts.xml,并且在struts.xml中配置LoginAction

        • <action name="login_*" class="lxrm.struts2demo.actions.LoginAction" method="{1}">
                      <result name="success">/jsp/welcome.jsp</result>
                      <result name="input">/jsp/login.jsp</result>
                      <result name="regist">/jsp/register.jsp</result>
                  </action>
  • step8,创建welcom.jsp  register.jsp页面

  •  

    step9,浏览器访问login.jsp      
  •  

                        

以上是关于Struts2的主要内容,如果未能解决你的问题,请参考以下文章

struts2怎么防止sql注入

struts2请求过程源代码分析

[struts2学习笔记] 第五节 编写struts2的action代码

Struts2 s2-032远程代码执行分析

S2-053:Apache Struts2远程代码执行漏洞(中危)

struts2 s2-062 ONGL远程代码执行