struts1讲解

1.Struts的几个基本概念

1.struts是一个开源框架(frameset) 基于MVCWeb框架。

2.为什么有struts

有必要用一个统一的规范来开发项目。利于程序的维护和扩展以及提高开发效率,所以出现了struts.

struts是通过采用Java的Servlet/JSP技术,实现了基于Java EE Web应用的Model-View-Controller(MVC)设计模式的应用框架,是MVC经典设计模式中的一个经典产品

struts的优缺点如下: 
1.struts的好处:

程序更加规范化 
程序开发的效率提高了 
程序的可读性增加 
程序的可维护性增加

2.struts的不足之处:

form表单有点鸡肋 
action是单态(对网站并发性的处理有影响)

这些内容后面会介绍。

我们要知道的是:框架在提高了程序的规范的同时,也约束了程序员的自由。

3.struts的原理

以一个用户登录验证的例子说明。

3.1.时序图

时序图

1.ActionServlet是总控制器,它是struts给我们提供的,我们无需自己写,只需要配置即可。ActionServlet管理struts-config.xml文件,而这个文件是struts的核心文件,该文件配置了ActionForm,还配置了Action,以及它们的对应关系等。 
2.ActionForm是表单,用于存放数据。开发ActionFrom必须要继承ActionForm类,这是规范。 
3.Action是分控制器,在Struts中,Action可以有多个.它的本质就是Servlet。开发一个Action也要继承Action类。 
4.Model(Java类,Service类,ejb等)

3.2.struts入门案例

使用手动配置的方式来开发第一个struts1项目
首先,项目目录结构如下所示:


【步骤】: 
1.在开发struts的时候,需要struts的开发包

struts的开发包可到官网下载【下载地址】,https://struts.apache.org/download.cgi。下载Struts 1.3.10。并把所有的jar包加入到当前项目的lib文件夹。


2.先写出login.jsp

写最简单的登录页面login.jsp,如下:

<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<title>首页</title>
		<%  
    String basePath = request.getContextPath();  
%>  
	</head>


	<body>
		<html:form action="/login.do">
			用户名:<html:text property="username"></html:text><br/>
			密 码: <html:password property="password"></html:password><br/>
			<html:submit>submit</html:submit>
		</html:form>
	</body>
</html>
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 注意form中的action跳转地址,是我们的web应用下的login.do页面,这里在稍后介绍的struts-config.xml配置中会再说明。 

3.编写LoginForm和Action

(1)首先需要编写LoginForm,即用户登录所用的表单,用于填充用户输入的数据。如下:

package com.login;


import javax.servlet.http.HttpServletRequest;


import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;


public class LoginForm 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;
    }


}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

其实这就是一个很简单的JavaBean,它和login.jsp中的表单对应。 

(2)然后,编写Action,即登录的Action,它必须继承自Action类,如下:

package com.login;


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 mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        LoginForm lf = (LoginForm) form;
        String username = lf.getUsername();
        String password = lf.getPassword();
        String path  = "";
        if(null != username && "admin".equals(username) && null != password && "admin".equals(password)) {  
        	path  = "success";  
            request.setAttribute("username", username);  
        } else {  
        	path  = "error";  
        } 
        return mapping.findForward(path);
    }


}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

在这个类中,我们需要重写一个方法:excute。这个方法会处理业务逻辑,会自动调用,它有点类似于Servlet中的service方法,或者doGet/doPost方法。


4.配置struts-config.xml文件,这个文件一般放在/WEB-INF目录下,它配置Action、ActionForm以及它们的对应关系和跳转

<?xml version="1.0" encoding="UTF-8" ?>


<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
          "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">


<struts-config>


<!-- ActionForm  -->
    <form-beans>
    <!-- name:名称 type:类路径 -->
        <form-bean name="loginForm" type="com.login.LoginForm">
        </form-bean>
    </form-beans>
<!-- 设置全局URL,必须写在Action前面,这样任何Action都可以使用 -->
    <global-forwards>
        <forward name="result" path="/result.jsp" />
    </global-forwards>


<!-- 注册Action -->
    <action-mappings>
    <!-- name:名称 type:类路径 path:客户端(JSP)提交到服务器端时指定的路径(Form表单中的action=”/login.do" -->
        <action path="/login" type="com.login.LoginAction"
            name="loginForm" scope="request">
            <!-- 局部URL,只有这个action可以使用 -->
            <forward name="success" path="/success.jsp"></forward>
            <forward name="error" path="/error.jsp"></forward>
        </action>
    </action-mappings>




</struts-config>
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

(1)这个struts-config.xml引入了一个DTD文件:struts-config_1_3.dtd,这个文件可以在我们下载的jar包中找到,它定义了我们这个xml的约束,根元素为struts-config。 
(2)该配置文件主要通过form-beans来配置ActionForm、通过action-mappings来配置Action。 
(3)我们在form-beans下用form-bean来配置具体的ActionForm,比如当前文件配置了我们写的UserForm 
(4)在action-mappings下用action来配置具体的Action,比如当前文件配置了我们写的LoginAction 
(5)要注意这里action中的path参数配置,它就是我们的login.jsp中的表单action提交的地址,login.jsp中写的是login.do,这个login.do会交给struts的总控制器ActionServlet来处理,最后ActionServlet将通过一定的机制找到这里的path参数配置为/login的action,再通过该action配置的type参数找到具体的类。

从这个过程中我们可以发现,login.do在通过ActionServlet的处理后,最后找到的却是路径为/login的action,这似乎和.do这个后缀没有什么关系,的确是这样的,这个后缀只是习惯上的用法,我们完全可以在web.xml文件中将这个后缀设置成其他任何的名字。 
(6)最后要在具体的action下配置跳转关系。这里配置的参数和LoginAction中的excute方法所写要对应起来。


5.写出success.jsp和error.jsp页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<title>Error</title>
	</head>
	<body>
		<h1>欢迎[<%=request.getAttribute("username") %>]登陆成功!</h1>  
	</body>
</html>

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<title>Error</title>
	</head>
	<body>
		<h1>登陆失败!</h1>
	</body>
</html>





6.在web.xml中配置ActionServlet

struts的总控制器ActionServlet本质上还是一个Servlet,所以我们要在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">
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>
            org.apache.struts.action.ActionServlet
        </servlet-class>
        <init-param>
            <param-name>config</param-name>
            <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>
</web-app>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

我们要在该配置中指定struts-config.xml文件的地址。同时可以看到,我们在这里配置的后缀为*.do,也就是说所有以.do结尾的请求都要交给ActionServlet来处理。到这里,也就明白了为什么我们的login.jsp中写的提交地址为login.do

4.总结

struts1中的核心知识点:ActionServlet总控制器,Action分控制器,ActionForm表单,以及structs-config.xml和web.xml文件的配置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值