Struts2实现登陆功能Demo

时间:2023-01-07 17:54:42

最近在学习SSH框架,通过用struts实现一个简单的登陆功能,来学习struts相关知识,着重了解了struts的配置。

1、在Eclipse下创建StrutsDemo项目,并将struts2所必须的jar包导入lib目录下。

主要有如下7个jar包:commons-fileupload、commons-io、freemarker、javassiat、ognl、struts2-core、xwork。

2、在src目录下建立一个struts.xml文件用于配置struts。

struts.xml内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- struts2的action必须放在一个指定的包空间下定义 -->
<package name="default" namespace="/" extends="struts-default">
<action name="login" class="com.demo.LoginAction" method="execute">
<result name="success">/WEB-INF/success.jsp</result>
<result name="login">/WEB-INF/login.jsp</result>
</action>
</package>

</struts>

主要属性说明:

package-name:用于区别不同的package;必须是唯一的、可用的变量名;用于其它package来继承;

package--namespace:用于减少重复代码(和struts1比较);包的namespace属性用于定义该包的命名空间,命名空间作用为访问该包下的action路径的一部分。namespace属性可以不配置,如果不指定该属性,默认的命名空间为””。

package--extends:用于继承其它package以使用里面的过滤器等东东;

action--name:用于在一个package里区别不同的action;必须是唯一的、可用的变量名;是调用action时输入路径的组成部分;

action--class:action所在的路径(包名+类名);

action--method:action所调用的方法名;

action元素method属性,默认值为method=”execute”,也就是当action接收到请求后,交给哪个方法去处理,默认的是交给execute方法去处理,当然,也可以交给其他方法。

通常每个包都应该继承struts-default包,因为struts2很多核心功能都是拦截来实现的。如从请求中把请求参数封闭到action、文件上传和数据验证等都是通过拦截器实现的。

struts-default定义了这些拦截器和Result类型,可以这么说,当包继承了struts-default才能使用struts2提供的核心功能,struts-default包是在struts2-core-2.xx.jar文件中的struts-defalut.xml中定义。struts-default.xml也是struts2默认配置文件,struts2每次都会自动加载struts-default.xml文件。

result元素主要定义视图的跳转和返回的行为及类型。

常用开关的介绍
<constant name="struts.i18n.encoding" value="UTF-8"/>指定Web应用的默认编码集,相当于调用HttpServletRequest的setCharacterEncoding方法

<constant name="struts.action.extension" value="do"/>该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts 2处理。    如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。   

<constant name="struts.serve.static.browserCache " value="false"/>设置浏览器是否缓存静态内容,默认值为true,开发阶段最好false

<constant name="struts.configuration.xml.reload" value="true"/>当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false,开发阶段最好true

<constant name="struts.devMode" value="true"/>开发模式下设为true,这样可以打印出更详细的错误信息

<constant name="struts.enable.DynamicMethodInvocation" value="false"/>动态方法调用,可以解决多个请求对应一个Servlet的问题,后面详细讲解,默认为true,关闭则设为false.


3、在web.xml中加入struts2 MVC框架启动配置

web.xml内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 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_2_5.xsd">

<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<welcome-file-list>
<welcome-file>/WEB-INF/index.jsp</welcome-file>
</welcome-file-list>
</web-app>
4、在src目录下新建LoginAction类。

LoginAction.java代码如下:

package com.demo;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport {

/**
*
*/
private static final long serialVersionUID = -1438866827399732426L;

private String username;
private String password;

@Override
public String execute(){
System.out.println("run execute...");
if("admin".equals(username) && "123456".equals(password)){
return SUCCESS;
}
return LOGIN;
}


public String getUsername(){
return username;
}

public void setUsername(String name){
this.username = name;
}

public String getPassword(){
return password;
}

public void setPassword(String password){
this.password = password;
}
}

注:LoginAction类继承了ActionSupport类,并且在execute方法的返回里,使用了SUCCESS和LOGIN变量。它们俩对应的值分别为:success、login(小写)。所以,在struts.xml里配置的result的name属性里,必须写为小写。要不然,会报"Could not find action or result"的错误。

LoginAction有两个属性,Struts会自动把输入框中的内容通过getter、setter方法设置进来。

提交数据后,struts会自动调用execute方法。

返回值代表结果页面的名称,具体文件路径在配置文件中配置。

ActionSupport类的作用 :struts2不要求我们自己设计的action类继承任何的struts基类或struts接口。但是我们为了方便实现我们自己的action,大多数情况下都会继承com.opensymphony.xwork2.ActionSupport类,并重写此类里的public String execute() throws Exception方法。因为此类中实现了很多的实用借口,提供了很多默认方法,这些默认方法包括国际化信息的方法、默认的处理用户请求的方法等,这样可以大大的简化Acion的开发。 

Struts2中通常直接使用Action来封装HTTP请求参数,因此,Action类里还应该包含与请求参数对应的属性,并且为属性提供对应的getter和setter方法。


5、创建login.jsp页面和success.jsp页面

login.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>
<s:form action="login" method="post">
<s:label value="系统登陆"></s:label>
<s:textfield name="username" label="账号" />
<s:password name="password" label="密码" />
<s:submit value="登录" />
</s:form>

</body>
</html>
success.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>欢迎<s:property value="username"/>!</h2>
</body>
</html>
6、经过上述步骤,登录实例已经编写完毕。运行效果如下图:

登陆界面:在访问的时候加了action后缀,我这里不加就访问不了。照说应该是不加也行的。

Struts2实现登陆功能Demo

登陆成功界面:

Struts2实现登陆功能Demo

7、总结:对struts2进行了入门学习,尤其仔细看了struts配置的相关资料。学习struts是掌握SSH的第一步。千里之行,始于足下嘛。