五、基于Struts的MVC案例:用户登录

通过上一部分内容的学习,我们已经能完全看懂简单的Struts程序,并且知道通过增加Action来增加业务功能的实现,通过struts.xml实现路由映射,并通过JavaBean来传递数据。
本着应用就是最好的复习,我们用来做一个基于Struts的登录功能。在本案例中我们将运用所学习到的知识,尽量把Model、View以及Controller都明确划分出来。


执行过程示意图

因此,我们需要完成以下任务:

1.userLogin.jsp:为用户提供一个登录入口页面;
2.web.xml:引入Struts框架jar,并声明一个Struts的拦截器;
3.struts.xml:定义一个Struts框架的配置文件,用于配置实现URL与Action之间的路由映射。
4.User.java:实现一个Model,用于作为通信过程中传递参数的载体;
5.UserLoginAction.java:实现一个Action,用于处理用户登录验证的请求;
6.success.jsp:用户登录成功后,跳转的页面;
7.error.jsp:用户登录失败后,跳转的页面。

1.userLogin.jsp

userLogin.jsp:为用户提供一个登录入口页面,用户在此页面填写用户名username和密码password,并以表单形式POST到loginAction中处理;

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>


用户登录页面


    
用户名:
密    码:

2.web.xml

为了使用Struts框架,需要在项目的Web.xml中配置一个Struts拦截器,用于拦截用户的所有请求。



  
    struts2
    org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  
  
    struts2
    /*
  
  
    userLogin.jsp
  

3.struts.xml

请求被Struts拦截器获取后,需要到struts.xml中寻找路由映射,从URL地址映射为Action业务处理类。
在项目的Java Resources—>src文件夹下,新建struts.xml。代码如下:




    
    
    
    
    
        
            /success.jsp
            /error.jsp
        
    

4.User.java

在处理业务之前,为了实现JSP页面与Action之前的数据传输,需要先定义一个JavaBean实体类,作为传输参数的载体。
根据上一部分所学习可知,Struts框架建议使用包来管理Action,因此我们需要现在src下新建一个名为cn.demo.domain,用于存放所有JavaBean实体类。然后,在该包下新建User.java实体类。代码如下:

package cn.demo.domain;
public class User {
    private String username;
    private String password;
    // username的getter和setter方法
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    // password的getter和setter方法
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

5.UserLoginAction.java

Action业务处理类通过继承ActionSupport实现请求的获取响应,并包含一个User对象,用于存储JSP页面请求发送过来的参数对象。
根据上一部分所学习可知,Struts框架建议使用包来管理Action,因此我们需要现在src下新建一个名为cn.demo.action的包,用于存放所有Action业务处理类。然后,在该包下新建继承于ActionSupport的UserLoginAction类。

  • (注意:
    要继承ActionSupport父类,就需要引入命名空间:
    import com.opensymphony.xwork2.ActionSupport;
    要调用ActionContext上下文对象,就需要引入命名空间:
    import com.opensymphony.xwork2.ActionContext;
    要调用自定义实体类User,就需要引入命名空间:
    import cn.demo.domain.User;
    )*
    代码如下:
package cn.demo.action;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ActionContext;
import cn.demo.domain.User;

public class UserLoginAction extends ActionSupport {
    //1.定义User属性
    private User user; 

    // 2.user属性的getter和setter方法
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }

    //3.重写父类的execute()方法
    public String execute() throws Exception {
        //获取Context对象
        ActionContext context = ActionContext.getContext();
        if ("itcast".equals(user.getUsername())
                && "123".equals(user.getPassword())) {
            //将用户名和密码放入session中
            context.getSession().put("username", user.getUsername());
            context.getSession().put("password", user.getPassword());
            return SUCCESS;
        } else {
            context.getSession().put("error", "用户登录失败!");
            return ERROR;
        }
    }
}

6.success.jsp

若登录验证成功,则路由跳转到成功页面;

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>


用户登录成功页面


    

登录成功! 您的用户名是<%=request.getAttribute("user.username")%>

7.error.jsp

若登录验证失败,则路由跳转到失败页面。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>


用户登录失败页面


    

${error}
点击链接返回登录页面

跑起来,看看效果如何:


默认访问用户登录页面

验证成功后跳转到success

The End~

作者: 肖sir@ZHBIT
2018 年 09月 27日


你可能感兴趣的:(五、基于Struts的MVC案例:用户登录)