【struts框架的初步使用】

前言

因为之前已经可以使用maven来创建项目了,
因为这样我们可以节省很多很多的时间花费在下载jar包上了。

嘛,为什么说要用到struts框架呢,其实想想我们之前的项目,许多的项目的业务逻辑全是硬编码,代码都写死了不利于维护。

而struts框架可以通过一些配置文件来动态的修改代码,

嘛,总的来说,就是便于修改代码,便于维护

先给大家看一下我的项目的一些结构

在这里插入图片描述


struts的基本介绍

Struts是Apache基金组织中Jakarta项目组的一个开源(Open Source)项目,主要就是实现了MVC设计模式,在Struts中有自己的控制器(ActionServlet),同时也提供了各种常用的页面标签库以减少JSP页面中的Scriptlet代码,Struts实际上就属于在传统技术上发展起来的一种新的应用模式,其操作的本质依然还是JSP、Servlet、JavaBean等技术的应用。

上面是官方回答;
下面是官方流程图;
在这里插入图片描述
其实看明白是一回事,会用又是一回事了。


sturts的配置文件

sturts-base.xml

用来设置sturts的功能

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
	"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
	<constant name="struts.i18n.encoding" value="UTF-8" />
	<constant name="struts.devMode" value="true" />
	<constant name="struts.configuration.xml.reload" value="true" />
	<constant name="struts.i18n.reload" value="true" />
	<constant name="struts.enable.DynamicMethodInvocation" value="true" />

	<package name="base" extends="struts-default" abstract="true">
		<global-allowed-methods>regex:.*</global-allowed-methods>
	</package>
</struts>

struts-sy.xml等

这个配置文件是可以有多个的,就相当于不同的包里有不同的文件。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
	"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
	<package name="sy" extends="base" namespace="/sy"><!-- 相当于一个包--->
		<action name="/demo_*" class="com.liwangwang.web.DemoAction" method="{1}" >
			<result name="rs">/rs.jsp</result><!-- 返回的路径--->
		</action>
	
	</package>
</struts>

struts.xml

全局配置,有多少配置文件都得引用

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
	"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
	<include file="struts-default.xml"></include>
	<include file="struts-base.xml"></include>
	<include file="struts-sy.xml"></include><!-- 可以有多个 -->
</struts>

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>Insert title here</title>
</head>
<body>
	<h3>动态调用方法</h3>
	<a href="sy/demo_add.action">add</a><!-- sy指的是在struts-sy.xml下面的action -->
	<a href="sy/demo_del.action">del</a><!-- _*这个是决定调用的方法 -->
	
</body>
</html>

因为我们在这个地方配置了方法的传递重点

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
	"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
	<package name="sy" extends="base" namespace="/sy"><!-- 相当于一个包--->
		<action name="/demo_*" class="com.liwangwang.web.DemoAction" method="{1}" >
			<result name="rs">/rs.jsp</result><!-- 返回的路径--->
		</action>
	
	</package>
</struts>

那么java代码

public class DemoAction  {

	public String add() {//从_add的方法中获取到了这个的方法名
		System.out.println("add方法启动了");
		return "rs";
	}
	
	public String del() {
		System.out.println("del方法启动了");
		return "rs";
	}
	
	
}

如此就能实现动态调用了


struts如何从jsp界面传参到后台

第一种ModelDriven自动获取参数

我们先建一个实体类

public class cal {

	private String num1;
	private String num2;
	public String getNum1() {
		return num1;
	}
	public void setNum1(String num1) {
		this.num1 = num1;
	}
	public String getNum2() {
		return num2;
	}
	public void setNum2(String num2) {
		this.num2 = num2;
	}
	@Override
	public String toString() {
		return "cal [num1=" + num1 + ", num2=" + num2 + "]";
	}

}

一个DemoAction 的实现接口ModelDriven

public class DemoAction implements ModelDriven<cal>{
	private cal cal1 = new cal();
	
	public String accept1() {
		System.out.println("cal1:"+cal1);
		return "rs";
	}
	@Override
	public cal getModel() {
		return cal1;
	}

}

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>Insert title here</title>
</head>
<body>

	<a href="sy/demo_accept1.action?num1=20&&num2=5">accept1</a>
	
</body>
</html>

结果为:
在这里插入图片描述


第二种set/get自动获取参数

DemoAction的内容

public class DemoAction {
	private cal cal2 ;
	private String sex;
	
	public cal getCal2() {
		return cal2;
	}

	public void setCal2(cal cal2) {
		this.cal2 = cal2;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}


	public String accept2() {
		System.out.println("cal2:"+cal2);
		return "rs";
	}
	public String accept3() {
		System.out.println("sex:"+sex);
		return "rs";
	}


}

然后重点,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>Insert title here</title>
</head>
<body>
	<a href="sy/demo_accept2.action?cal2.num1=20&&cal2.num2=5">accept2</a>
	<!-- 这个必须要用到-->实体类.属性 来赋值   -->
	<a href="sy/demo_accept3.action?sex=nv">accept3</a>
	<!-- 这个是一个数据类型 -->
</body>
</html>

struts如何从后台传参到jsp界面

set/get传参

其实如果用的是set/get方法传参的话,
就不需要任何操作,直接在跳转界面引用就行

在这里插入图片描述

J2EE容器交互传参

注入(耦合和解耦)

因为解耦很少有人用,所以也就不过多讲解,
按我的看法的话就是对request等作一个更深的一个剖析

OK,那么就重点讲一下耦合.

其实也就是实现ServletRequestAware,或ServletResponseAware接口


public class DemoAction implements ServletRequestAware {
	HttpServletRequest req;
	private cal cal1 = new cal();

	public String accept1() {
		System.out.println("cal1:"+cal1);
		req.setAttribute("cal1", cal1);
		return "rs";
	}


	@Override
	public void setServletRequest(HttpServletRequest arg0) {
			req = arg0;
		
	}
}

非注入(耦合和解耦)

也是一样的,只不过这个不需要用到实现接口的来说


public class DemoAction  {
	private cal cal1 = new cal();

	public String accept1() {
		System.out.println("cal1:"+cal1);
		HttpServletRequest req = ServletActionContext.getRequest();
		req.setAttribute("cal1", cal1);
		return "rs";
	}
	
}

总结

嘛,其实每个知识点都很简单的,额,为什么看起来这么多,咱也不知道

Thanks♪(・ω・)ノ希望对大家有所帮助

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值