Struts2一之典型用例

写一个简单的登录跳转的场景来记录下struts2的用法。

前端使用的是DMI请求方式,后台action使用继承ActionSupport的方式创建action

一.构建struts2环境

1.导入struts2的jar包

2.配置struts2的核心配置文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
	<package name="abc" extends="struts-default">
		<action name="userlogin" class="com.softeem.actions.LoginAction">
			<result name="success">/index.jsp</result>
			<result name="fail">/fail.jsp</result>
		</action>
	</package>
</struts>    

3.在web.xml中启用struts2配置

<?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">
  <display-name></display-name>	
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <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>*.action</url-pattern>
  </filter-mapping>
  
  </web-app>

二.构建业务场景

demo中有三个页面:login.jsp ,index.jsp,fail.jsp

一个action业务类:LoginAction

1.业务流程:

1).用户在login.jsp登录页面输入用户名和密码。

2).调用LoginAction的check方法验证,验证成功跳转到index.jsp页面,验证失败跳转fail.jsp页面。

2.各文件配置

login页面:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'login.jsp' starting page</title>
  </head>
  
  <body>
  <font color="red" size="+3" face="微软雅黑">登录页面</font>
	  <form action="userlogin!check.action" method="post">
	              账号:<input type="text" name="user.userName"><br>
	              密码:<input type="text" name="user.userPass"><br>
	       <input type="button" value="注册" onclick="javascript:window.location.href='regist.jsp'" />
	       <input type="submit" value="登录">
	 </form>
  </body>
</html>

成功页面:

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
  </head>
  
  <body>
  ${user.userName}<br>
  </body>
</html>

失败页面:

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>
 <body>
	login fail!
  </body>
</html>

action业务处理类:

package com.softeem.actions;

import com.opensymphony.xwork2.ActionSupport;
import com.softeem.pojos.User;


public class LoginAction extends ActionSupport{
	private User user;
	
	
	@Override
	public String execute() throws Exception {
		return "success";
	}

	public String check(){
		System.out.println("userName:"+user.getUserName()+"|userPass:"+user.getUserPass());
		if(user.getUserName().equals("admin")&&user.getUserPass().equals("123456")){
			return "success";
		}else{
			return "fail";
		}
	}
	
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}

}

action中用到了一个数据封装对象User:

package com.softeem.pojos;

import java.io.Serializable;

public class User implements Serializable{
	private int userId;
	private String userName;
	private String userPass;

	
	public int getUserId() {
		return userId;
	}
	public void setUserId(int userId) {
		this.userId = userId;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getUserPass() {
		return userPass;
	}
	public void setUserPass(String userPass) {
		this.userPass = userPass;
	}
	

}

测试:

打开页面login.jsp:

输入账号/密码:admin/123456,登录成功页面:

输入其他账号/密码:admin/1234,登录失败跳转页面:

上面的代码中有几个点需要注意:

1)url到业务处理方法的映射。首先LoginAction需要在配置文件中配置,相当于注册。在login.jsp中通url:userlogin!check.action这个地址映射到LoginAction的check方法中。这是struts2种的DMI映射方式。

2)参数的传递与接收。参数使用的User业务数据对象进行封装,struts2中接收请求的方法都是无参的方法,参数不能直接通过方法中定义的参数传递给业务处理方法,必须通过类中的定义的成员属性来接收前端传递过来的参数。

3)处理后的页面跳转。struts2中的接收请求的方法的返回值都是String类型的,其处理完毕后的页面跳转也要在struts2的核心配置文件中配置,通过不同的result返回码来映射到不同的返回结果页面,这也导致了一个问题是一个类中的所有方法都共用返回页面配置。

三.struts2与SpringMVC的简单比较

从使用MVC框架的经验来看,我认为一个MVC框架主要具备的核心功能点有:

1)url到业务处理方法的映射实现。

2)前后端数据传递过程中的数据自动封装。

3)处理完毕后的页面跳转实现。

其他的数据类型的转换,数据校验等都属于辅助性的功能。

通过以上3个点来对struts2和springMVC做一个简单的对比。

对比项目

SpringMVC Struts2

URL映射配置

注解实现,在请求处理类中加入注解

配置文件实现,在struts2配置文件中对请求处理类配置

参数传递实现(粒度)

 

方法级粒度

业务方法参数直接接收

 

同一类中不同方法不共享前端参数

类级粒度

需要在请求处理类中定义成员属性类来接受参数

同一类中的各个方法共享前端参数

处理结果页面跳转(粒度)

方法级返回配置粒度

可以返回页面,json等各种格式数据,注解实现

同一类中不同方法不共享返回配置

类级返回配置粒度

返回页面,需在配置文件中配置对应关系,配置文件实现

同一类中的不同方法共享返回配置

猜你喜欢

转载自blog.csdn.net/w450093854/article/details/84135095
今日推荐