目录
前言
因为之前已经可以使用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♪(・ω・)ノ希望对大家有所帮助