我什么都有,就是没钱

本人的android:qq群:181235811,欢迎大家加入讨论技术问题呀
  博客园  :: 首页  :: 新随笔  :: 联系 :: 管理

struts2之入门login

Posted on 2013-11-21 09:12  我什么都有,就是没钱  阅读(449)  评论(0)    收藏  举报

1.struts 最小开发需要的jar有:
struts2-core-2.2.3.jar :Struts 2框架的核心类库
xwork-core-2.2.3.jar :XWork类库,Struts 2在其上构建
commons-fileupload-1.2.2.jar :文件上传组件,2.1.6版本后必须加入此文件
commons-io-2.0.1.jar
commons-logging-1.1.1.jar :日志包,Struts 2框架使用这个日志包来支持Log4J和JDK 1.4+的日志记录。
freemarker-2.3.16.jar :Struts 2的UI标签的模板
ognl-3.0.1.jar  :对象图导航语言(Object Graph Navigation Language),struts2框架通过其读写对象的属性
commons-lang-2.5.jar (这个是不必须的)

javassist-3.11.0.GA.jar :操作字节码的jar (这个也是不必须的)

把上面必须的jar包拷贝到项目中的WebRoot/WEB-INF/lib目录中,并且进行add build path设置,这样struts2开发需要的jar包已经包括进来了

 

2.配置web.xml

web.xml需要增加struts2的过滤器,下面对应的是web.xml中的structs的配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name>    
      
    <filter>
        <filter-name>StrutsPrepareAndExecuteFilter</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
        
    </filter>
    <filter-mapping>
        <filter-name>StrutsPrepareAndExecuteFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

 

3.主页设计

我的jsp页面是index.jsp(由于不想写login.jsp然后在web.xml中配置,麻烦)。

下面是用户登录的jsp页面:

<form action="Login.action" method="post">
        <table    align="center">
            <caption><h3>用户登录</h3></caption>
            <tr>
                <td>用户名:<input type="text" name="username"/></td>
            
            </tr>
            <tr>
                <td>&nbsp;&nbsp;码:<input type="text" name="password"/></td>
            
            </tr>
            <tr align="center">
                <td colspan="2"><input type="submit" value="登录"/>
                    <input type="reset" value="重填"/>
                </td>            
            </tr>
        </table>
    </form>

 可以看到,action的内容是xxx.action,这是struts2的设置需要

 

4.struts.xml配置

下面是struts.xml的内容(注意,是struts.xml,不是structs.xml)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
    "http://struts.apache.org/dtds/struts-2.1.7.dtd">   
<struts>
    <!-- 请求路径:/com -->
    <!-- 
        package:structs2框架使用包管理action,这里的包相当于java中的包
            *name:包的名称,唯一的,主要作用于继承
            *namespace:命名空间,相当于房间号,唯一的
            *extends:sturcts2中所有的包都要继承默认的包structs-default
        action:配置structs2框架要访问的action
            * name:structs2框架访问的action,在同一个包中唯一
            * class:要访问的action的完整类路径
        result:处理action的execute()方法的返回结果
            * name:结果的唯一标示,该值必须和action中execute方法的返回值相同
            * result:要转发重定向的路径
     -->
    <package name="structDemo0"  extends="struts-default">
        <action name="Login" class="com.login.LoginAction">
            <result name="error">/login/error.jsp</result>
            <result name="success">/login/success.jsp</result>
        </action>
    </package>
</struts>

   (注意:这个地方action中的name不能任意写(我已经验证过了,你可以试着下一个login,form提交也写login,你会发现页面提示错误,说没有result(感觉很奇怪)),struts2中好像有这样写着:name和class有对应关系,name+Action=class中的类名。)

  正确的是可以任意写,我之所以不能任意写,是因为我安装了一个插件:struts2-convention-plugin,这个插件有个约定,就是action和class的对应关系,就是上面所说的,把这个插件去了就没问题了。

 

5.Action实现类代码

下面是LoginAction.java的代码

package com.login;

import com.opensymphony.xwork2.Action;


public class LoginAction implements Action {
    
    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;
    }

    @Override
    public String execute() throws Exception {
        // TODO Auto-generated method stub
        
        if(getUsername().equals("zyf") && getPassword().equals("123456"))
            return SUCCESS;
        else
            return ERROR;
    
    }

}

 

6.登录成功和失败对应的跳转页面代码

下面是success.jsp的代码

<%@ page language="java" import="java.util.*" 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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
    登录成功ŠŸ
</body>
</html>

关于error.jsp内容和success.jsp内容一样就不多说了。

 

7.文件结构如下:

8.出现错误的解决方法

第一次做struts2的入门,基本上都会碰见这个错误:

Could not find action or result 
There is no Action mapped for namespace / and action name login. - [unknown location] 

...

网上有很多的解决方法,如:http://bbs.csdn.net/topics/230059976,关键是看自己到底为啥会出现这个错误,人家出错的原因可能和你不一样

我的就是和大部分人的一样,把struts写成了structs,不光是struts.xml,还有内部的配置都写错了(即extends="struts-default"我也写错了),以致于查找错误找了3个小时。