struts2环境搭建---【小白系列】0基础到熟练应用struts2框架(一)

前记:

        其实一直很反感社会上流传的从入门到精通,这个概念,什么是精通?不是用过一点时间,再把源码看透,怎么敢说精通。好了闲话不扯,本系列教程主要讲解struts2的入门到熟练使用,同样也是我个人学习笔记,以及我对struts2的理解

Struts2概念

         Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小

       以上是百度百科给我们的答案,那么我自己的理解就是Strurs是一款web表现层的框架,它采用了mvc的设计模式。常见的javaweb .net php python等等 不过作为我们的JavaEE攻城狮来说是轻mvc重三层架构的三层架构(web service dao)这是我们javaweb特有的。其实struts2和struts1关系不大,因为它是在WebWork的基础上二次开发。你也可以理解成java和JavaScript,只是借用个名头而已所以 struts2是WebWork的升级版 Struts2基于WebWork,而WebWork 又基于xwork

Struts2快速入门

     其实struts2就是插拔式的一个框架,所谓的插拔式就是,你想用就用,不想用了就扔掉,很方便。通俗点就是在web.xml中配一个过滤器,让每一次请求都去走这个过滤器。
加上过滤器就算使用struts2,不加就不用了。

执行流程:

客户端发送请求

tomcat服务器解析请求并且将请求数据封装到request

然后通过过滤器,找到struts.xml中的与请求相对的action

执行action方法,返回结果


环境搭建

1.导入struts2所需jar包

\struts2下载\struts-2.3.24-all\struts-2.3.24\apps\struts2-blank\WEB-INF\lib下所有包



\资料\其他jar包\hibernate基本jar

2.在web.xml配置过滤器

    <filter>
  	<filter-name>Struts</filter-name>
  	<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>Struts</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>



3.创建Action









public class QuickTestAction {
	public void execute() {
		System.out.println("Test action .... ");
	}
	public String save(){
		return "save";
	}
	public String update(){
		return "update";
	}
	public String delete(){
		return "delete";
	}
}


4.在src下创建struts.xml


5.配置struts.xml

<?xml version="1.0" encoding="UTF-8"?>
   <!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<package name="mytest" extends="struts-default" namespace="/">
		<action name="test" class="com.test.struts.QuickTestAction"></action>
	</package>
</struts>

我们来访问测试下
http://localhost:8080/strutsTest/test

如果控制台成功输出则struts2配置完成。

struts2核心过滤器详解

StrutsPrepareAndExecuteFilter(Struts准备和执行过滤器)
进入这个Filter然后依次查看实现
 dispatcher = init.initDispatcher(config);//查看实现
 dispatcher.init();//查看实现



服务器在启动时,创建filter对象,就会执行init()方法,然后加载配置文件

加载顺序:

default.properties:struts2自己定义好的配置文件
struts-default.xml:struts2自己定义好的配置文件
struts-plugin:struts2插件自己定义好的配置文件
struts.xml:自定义的
struts.properties:自定义
核心filter初始化参数:自定义

后加载的配置文件如果与先加载的配置文件有冲突的话,后覆盖前

详解配置文件

default.properties

位置:struts-core.jar/org/apach/struts2/default.properties
该文件内部配置的是一些常量参数 格式键值对
struts.i18n.encoding=UTF-8 默认编码
post的乱码struts2已经解决 get需要手动解决


struts.objectFactory = spring
指定Action是由哪个框架创建的 这句话的意思是把action的创建权限交给spring


struts.devMode = false
develope mode 是否设置为开发模式
如果设置为true 变成开发模式 当修改struts.xml配置文件后不需要重启服务


struts.action.extension=action,,
Action访问时的默认扩展名 例如 abc,,def,那么(*.abc ) ( *) (*.def)可以访问到资源


struts.multipart.maxSize=2097152
使用struts2进行文件上传默认的 允许上传文件大小


struts-default.xml

位置:struts-core.jar下
1)功能bean
2)常量
3)抽象包
4)结果跳转类型
5)拦截器

在自己的xml配置文件中覆盖struts-default包内部的默认配置


struts.xml配置(包括action的配置)

在src下创建struts.xml--自定义 配置自己的内容 配置覆盖之前文件内容


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<!-- 根标签 -->
<struts>
	<!-- 常量  键值对 -->
	<constant name="struts.devMode" value="true"></constant>
	<constant name="struts.action.extension" value="action,abc,def,,"></constant>
	<!-- 动态方法调用的开启 -->
	<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
	
	<!-- package包配置 包内部配置action
			package包是一个虚拟包/逻辑包  不存在  主要目的方便action的管理
			属性:
				name:包的名称  包名称不能重复
				namespace:命名空间  该命名空间与Action的name一起组成访问的虚拟地址
					例如: namespace="/customer"
					url:http://localhost:8080/Struts2_Day01/customer/quick.action
				extends:该包继承哪个包  一般情况下 继承struts-default
					继承了包 才能使用父包中都已经定义好的一些内容
				abstract:声明该包是否是一个抽象包  只能被别的包继承 不能创建Action
	 -->
	<package name="test" namespace="/" extends="struts-default">
	
		<!-- <interceptors>
			声明自己定义的拦截器
			<interceptor name="myInterceptor" class="全包名"></interceptor>
			定义拦截器栈
			<interceptor-stack name="myStack">
				<interceptor-ref name="myInterceptor"></interceptor-ref>
				<interceptor-ref name="defaultStack"></interceptor-ref>
			</interceptor-stack>
		</interceptors>
		引用默认的拦截器栈
		<default-interceptor-ref name="myStack" /> -->
		
		<!-- 定义自己的结果类型 -->
		<!-- <result-types>
			<result-type name="myResultType" class="com.opensymphony.xwork2.ActionChainResult"/>
		</result-types> -->
		
		<!-- 定义Action:封装逻辑代码的类
				属性:
					name:该Action的虚拟名称  该name与namespace一起组成访问的虚拟的地址
					class:该Action全限定名
					method:指定访问该Action中的哪个方法
		 -->
		<action name="quick" class="cn.nanjin.action.QuickAction" method="save">
			<!-- 结果视图 
					属性:
						name:逻辑视图名
						result标签体中配置实际的页面的地址
						type: 跳转方式  转发 重定向..
			-->
			<result name="success">/success.jsp</result>
			<result name="save">/save.jsp</result>
			<result name="update">/update.jsp</result>
		</action>
		<action name="update" class="cn.nanjin.action.QuickAction" method="update">
			<result name="success">/success.jsp</result>
			<result name="save">/save.jsp</result>
			<result name="update">/update.jsp</result>
		</action>
		
		<!-- 
			*代表任意 标识通配符
			{n} n代表第几个*
			
			例如:
				http://localhost:8080/Struts2_Day01/quick2_save.action
				*===save
				method="save"
				
				http://localhost:8080/Struts2_Day01/quick2_update.action
				*===update
				method="update"
			
		 -->
		<!-- 重点 -->
		<action name="quick2_*" class="cn.nanjin.action.QuickAction2" method="{1}">
			<result name="delete">/success.jsp</result>
			<result name="save">/save.jsp</result>
			<result name="update">/update.jsp</result>
		</action>
		<!-- 
			例如:
				http://localhost:8080/quick3_save_User.action
				第一个*===save
				第二个*===User
				method=saveUser
				
				http://localhost:8080/quick3_update_User.action
				第一个*===uodate
				第二个*===User
				method=updateUser
		 -->
		<action name="quick3_*_*" class="cn.nanjin.action.QuickAction3" method="{1}{2}">
			<result name="delete">/success.jsp</result>
			<result name="save">/save.jsp</result>
			<result name="update">/update.jsp</result>
		</action>
		
		<!-- 动态方法调用(了解)
				开启动态方法调用(默认是关闭)
					xml配置简单 如下配置
					页面访问url有要求
					
				配置一个常量:
					struts.enable.DynamicMethodInvocation = true
				
				例如:
					http://localhost:8080/Struts2_Day01/quick4!save.action
					http://localhost:8080/Struts2_Day01/quick4!update.action
		 -->
		<action name="quick4" class="cn.nanjin.action.QuickAction4">
			<result name="delete">/success.jsp</result>
			<result name="save">/save.jsp</result>
			<result name="update">/update.jsp</result>
		</action>
		
	</package>
	
	
	<!-- 加载其他的struts配置文件,分模块开发 -->
	<!-- <include file="struts-customer.xml"></include>
	<include file="struts-linkman.xml"></include> -->
	
</struts>


struts.properties

只能配置常量 键值对
实际开发中 一般常量习惯在struts.xml中配置
没什么用

核心filter 初始化参数



Struts2的API

Action的定义的三种方式

1)Action可以定义成一个POJO

2)定义Action类实现Action接口
好处:规范开发 Action接口提供了5个直接使用的常量

3)定义的Action类继承ActionSupport(重点)
子的功能更加强大 例如 可以进行国际化 表单校验....



综合案例:

需求

编写程序实现查询所有客户信息并回显页面

步骤


1.实体类 Customer.java

public class Customer implements Serializable {
	private Long cust_id;
	private String cust_name;
	private String cust_source;
	private String cust_industry;
	private String cust_level;
	private String cust_phone;
	private String cust_mobile;

2.hibernate映射Customer.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.test.domain.Customer" table="cst_customer">
	<id name="cust_id">
			<generator class="native"></generator>
		</id>
		<property name="cust_name"></property>
		<property name="cust_source"></property>
		<property name="cust_industry"></property>
		<property name="cust_level"></property>
		<property name="cust_phone"></property>
		<property name="cust_mobile"></property>
</class>
</hibernate-mappin

3.hibernate主配置文件 hibernate.cfg.xml


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
	
<hibernate-configuration>
	<session-factory>
		<!-- 1、数据库连接信息 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql:///struts_demo</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">123456</property>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<!-- 2、hiebernate其他参数 可选 -->
		<property name="hibernate.hbm2ddl.auto">update</property>
		<property name="hibernate.show_sql">true</property>
		<property name="hibernate.format_sql">true</property>
		<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
		<!-- 3、加载映射 -->
		<mapping resource="com/test/domain/Customer.hbm.xml"/>
	</session-factory>
</hibernate-configuration>

4.action 

public class CustomerAction extends ActionSupport {
     public String findCustomerList(){
    	try {
    		//业务处理
			CustomerService service =new CustomerServiceimpl();
			List<Customer> list =service.findCustomerList();
			ServletActionContext.getRequest().setAttribute("list", list);
			return "success";
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
    	 
     }
}

5.serviceimpl

public List<Customer> findCustomerList() throws Exception {
		List<Customer> result =null;
		CustomerDao dao=new Customerimpl();
		result =dao.findCustomerList();
		return result;
		

	}

6.dao

	public List<Customer> findCustomerList() throws Exception {
		List<Customer> result =null;
		
		String hql ="from Customer ";
		Configuration conf =new Configuration().configure();
		SessionFactory factory = conf.buildSessionFactory();
		Session session = factory.openSession();
		Transaction tx = session.beginTransaction();
		Query query = session.createQuery(hql);
		result =query.list();
		
		tx.commit();
		
		session.close();
		factory.close();
		return result;
	}

7.struts.xml


<action name="customer_*" class="com.test.struts.CustomerAction" method="{1}">
		<result name="success">/jsp/customer/list.jsp</result>
		</action>

8.回显页面



  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LawsonJin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值