Struts基础应用1——登录

7 篇文章 1 订阅
3 篇文章 0 订阅

本例实现Struts最简单的功能——用户登录。内容来自《Java Web整合开发与项目实战》。

struts实例

首先,从官网下载Struts软件,解压后将lib内的jar包拷贝到自己web项目内的WEB-INF/lib下。

然后,直接上代码:

login_struts.jsp,登录界面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    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=UTF-8">
<title>login</title>
</head>
<body bgcolor="#dbdbdb">
<h1>login.jsp demo used struts</h1>
<form action="login.do" method="post">
请输入用户名:
<input type="text" name="username" value=""/>
请输入密码:
<input type="text" name="password" value=""/>
<br>
<input type="submit" name="Submit" value="提交"/>
<input type="reset" name="Reset" value="重置"/> 
</form>
</body>
</html>

新手会对action的值感到疑惑,服务器如何处理“login.do”呢?

在web.xml内配置这样一个servlet即可:

<servlet>  
   <servlet-name>action</servlet-name>  
   <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>  
   <init-param>  
     <param-name>config</param-name>  
     <!--  去加载struts-config文件-->
     <param-value>/WEB-INF/struts-config.xml</param-value>  
   </init-param>  
   <init-param>  
     <param-name>debug</param-name>  
     <param-value>2</param-value>  
   </init-param>  
   <init-param>  
     <param-name>detail</param-name>  
     <param-value>2</param-value>  
   </init-param>  
   <load-on-startup>2</load-on-startup>  
 </servlet>  

 <servlet-mapping>  
   <servlet-name>action</servlet-name>  
   <url-pattern>*.do</url-pattern>  
 </servlet-mapping>  

struts-config文件,主要配置struts的各种组件,当遇到”/login.do”的请求时,RequestProcessor会在这里找这个path该交给哪个action类的子类来操作,后续也会根据forward的值进行选择下一步方向,就好像一个指路人。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC  
         "-//Apache Software Foundation//DTD Struts Configuration1.2//EN"  
         "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">  

<struts-config>  
    <form-beans> <!-- 每个ActionForm类都要在这里配置 -->
       <form-bean name="loginActionForm" type="myStruts.LoginActionForm"/>  <!--会自动创建loginActionForm的实例,调用setter-->
    </form-beans>  

    <action-mappings> 
     <!-- 一旦Action实例确定,就会调用RequestProcessor类的processActionPerform方法, 
                processActionPerform方法内部调用Action实例的excute()方法--> 
       <action path="/login"  
              type="myStruts.LoginAction" 
              name="loginActionForm"  
              scope="request"  >  
              <forward name="success" path="/success_struts.jsp"/>  
              <forward name="error" path="/error_struts.jsp"/>  
       </action>  

       <action unknown="true" forward="/error_struts.jsp" name="error"/><!-- 定义没找到path时的错误界面 -->
    </action-mappings>    
</struts-config> 

此类主要负责保存表单的参数,采用JavaBean的风格,必须有getter和setter,

package myStruts;

import org.apache.struts.action.ActionForm;

public class LoginActionForm extends ActionForm{

    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;
    }

}

此类便是Action的子类,执行核心操作,可以不继承自Action,只要有一个返回字符串的无参的public方法。

package myStruts;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class LoginAction extends Action{

    public ActionForward execute(ActionMapping actionMapping,ActionForm actionForm,HttpServletRequest servletRequest,HttpServletResponse httpServletResponse) {
        LoginActionForm loginForm = (LoginActionForm)actionForm;
        String username = loginForm.getUsername();
        String password = loginForm.getPassword();
        String actionpath = "";
        if(username.equals("123")&&password.equals("123"))
            actionpath = "success";
        else
            actionpath = "error";
        return actionMapping.findForward(actionpath);
        //回到struts-config.xml内找对应的forward标签。
    }
}

这是登陆成功的界面

<%@page import="myStruts.LoginActionForm"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Success!</h1>
<p>Hi,${param.username}</p>
等价于:
<% LoginActionForm loginActionForm=(LoginActionForm)request.getAttribute("loginActionForm");%>
<!--属性名就是在struts-config.xml定义的名字-->
<p>Hi,<%=loginActionForm.getUsername()%></p>
</body>
</html>

如果在struts-config.xml的forward标签增加定义redirect=”true”,则不可用以上两种方式来获取用户名,重定向后request会被清空,即使跳转到本页面,form表单也会清空,相当于在地址栏中重新输入了网址,然后转向该网址一样。

而默认的redirect=”false”是服务器端跳转,服务器把用户的请求转到了另一个地方,但是只能在一个web服务中跳转,request和form也可以保留。

登录错误(密码不对)界面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Error!</h1>
</body>
</html>

struts基本简要流程如下:

  1. 客户端浏览器发出HTTP请求。
  2. 根据web.xml配置,该请求被FilterDispatcher拦截。
  3. 根据struts-config.xml配置,找到需要调用的Action类和方法,然后把已经拦截的请求发给对应的业务类来处理。
  4. Action调用业务逻辑组件处理业务逻辑(如果action元素没有指定method属性值,则默认调用execute方法)。
  5. Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面。
  6. 返回HTTP响应到客户端浏览器。

为什么要用struts框架?

我们在不适用框架的时候,MVC中典型的控制器是servlet,servlet可以获取参数和逻辑模型的调用和转向功能。而struts对它做了封装,为什么要进行封装?
当我们请求到一个servlet,我们在这个servlet中取得参数、调用业务逻辑、转向,我们在servlet中写死了转向页面,当我们想要换一个转向页面的时候就需要改动代码了,改动代码后还要重新进行编译。
而且从表单中传递过来的数据全是字符串形式,我们还需要根据实际的需求把字符串转换为我们需要的类型,如果很多地方需要转换,并且每次使用每次都要进行转换,有没有一种机制,把表单中的字符串拿过来自动转换为相应的类型呢?不需要我们再进行手动转换呢?
基于上述的不便,转向不灵活,表单中的字符串每次都要进行转换等一系列的原因,struts把这些做了封装。提取出重复的操作,转向信息放到了配置文件中,这样更加灵活了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值