Struts2框架与Spring框架初解三
Spring框架
读取 properties配置文件
<!-- location 让spring去读取配置文件,
能够在当前spring的配置文件中获取使用 -->
<context:property-placeholder location="classpath:user.properties"></context:property-placeholder>
value使用json字符串 获取配置文件中的内容
<bean id="user02" class="com.lanou.entity.User">
<property name="orders" ref="orderlist"></property>
<property name="name" value="${user.name}"></property>
<property name="pwd" value="${user.pwd}"></property>
</bean>
注意: properties中避免使用 user user.name等 user.name默认指本计算机用户名使用Spring框架配置数据源 和 hibernate
注: 配置文件中的头文件 可以下载插件自动生成
<!-- 配置数据源 -->
<!-- id自己命名 无要求 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/jdbcd"></property>
<property name="user" value="root"></property>
<property name="password" value="123456"></property>
</bean>
<!-- 有了dataSource 就可以扩展sessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<!-- 获取数据源 -->
<property name="dataSource" ref="dataSource"></property>
<!-- hibernate自身的配置 -->
<property name="hibernateProperties">
<props>
<!-- 配置方言 必须的 重要 -->
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
<!-- 扫描映射文件 使用*通配符 可以自动扫描包下所有配置文件 -->
<property name="mappingLocations" value="classpath:com/lanou/entity/*.hbm.xml"></property>
</bean>
连接完数据源 生成sessionFactory 可以配置DAO层的内容
<bean id="userDao" class="com.lanou.dao.UserDao">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
使用配置的dataSource和sessionFactory查找数据库
注意: 配置表映射关系的配置文件
public static void main(String[] args) throws SQLException {
ApplicationContext ac = new ClassPathXmlApplicationContext("application-pools.xml");
ComboPooledDataSource dataSource = (ComboPooledDataSource)ac.getBean("dataSource");
Connection connection = dataSource.getConnection();
String sql = "select * from jdbcd";
PreparedStatement ps = connection.prepareStatement(sql);
ResultSet resultSet = ps.executeQuery();
while (resultSet.next()) {
String string = resultSet.getString("username");
System.out.println(string);
}
构造注入
<bean id="stu1" class="com.lanou.entity.Student">
<!-- 构造注入 -->
<!-- 两参构造 double,int可以通过type切换选择对应属性 -->
<constructor-arg index="1" type="int" value="123"></constructor-arg>
<constructor-arg index="0" value="lna"></constructor-arg>
</bean>
value特殊符号 或 语句的录入
<bean id="stu2" class="com.lanou.entity.Student">
<constructor-arg name="stuName">
<value><![CDATA[<aaa>]]></value>
</constructor-arg>
<constructor-arg ref="car"></constructor-arg>
<property name="car.price" value="200"></property>
</bean>
自动注入 autowire
<!-- autowire="byName"根据属性的set方法名来进行匹配 自动注入 -->
<bean id="stu3" autowire="byName" class="com.lanou.entity.Student">
<property name="stuName" value="wukong"></property>
</bean>
autowire 自动注入的是该bean对象中的对象属性(并且该对象是IOC中与set注入名相同的bean对象)
比如 stu3中有一个car类对象作为属性 在IOC中配置了该car类的对象 且id="car"
继承 parent 和 依赖 denpends-on
<bean id="stu4" depends-on="car1" parent="stu3">
<!-- spring的EL表达式 -->
<property name="money" value="#{T(java.lang.Math).PI * 10}"></property>
<property name="stuName" value="#{car1.price > 30 ? '有钱人' : '兄弟一起吃土吧'}"></property>
</bean>
注意: 继承时 不会继承父级bean的 自动注入的属性
依赖的bean对象要在IOC中存在 否则bean无效
自动注入 (使用扫描注解)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- context:component-scan 扫描注解 -->
<context:component-scan base-package="com.lanou"></context:component-scan>
<!-- 配置数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/jdbcd"></property>
<property name="user" value="root"></property>
<property name="password" value="123456"></property>
</bean>
<!-- 配置sessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<!-- 获取数据源 -->
<property name="dataSource" ref="dataSource"></property>
<!-- hibernate自身的配置 -->
<property name="hibernateProperties">
<props>
<!-- 配置方言 必须的 重要的 -->
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
<!-- 扫描映射文件 -->
<property name="mappingLocations" value="classpath:com/lanou/entity/*.hbm.xml"></property>
</bean>
</beans>
此配置方法可以通过扫描注解直接注入依赖对象
不用在ICD中配置bean对象
@Repository
public class UserDao {
@Autowired
private SessionFactory sessionFactory;
public User findById(Integer id) {
Session session = sessionFactory.openSession();
User user = session.get(User.class, id);
return user;
}
}
Struts2框架
使用ajax 实现前后端交互 将后台返回的data以json字符串形式打印出来
创建struts2的action类
package com.lanou.controller;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport{
private String result;
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
public String test() throws JsonProcessingException {
User user = new User();
user.setUserName("哈哈哈");
user.setPassword("123");
// 要把user转换成json字符串
// 所以要用到 json转换工具
ObjectMapper mapper = new ObjectMapper();
// 实例化工具 mapper
// 用 mapper转化对象
result = mapper.writeValueAsString(user);
System.out.println(result);
return "success";
}
}
注意: 在result的方法中 使用ObjectMapper对象(实例化工具) 将返回的data对象转化成json字符串
在struts.xml配置文件中 需要配置返回json字符串类型
<struts> <!-- 如果要返回json 还需要继承json-default -->
<package name="json" namespace="/json" extends="struts-default,json-default">
<action name="test" class="com.lanou.controller.UserAction" method="test">
<!-- 要返回json 需要把type写成json -->
<result type="json" name="success">
<param name="root">
<!-- 是方法返回对象的属性名 -->
result
</param>
</result>
</action>
</package>
</struts>
写html页面 不需要form表单提交请求,使用ajax
<body>
<h1>这是我们用ajax实现的前后端交互页面</h1>
用户名:<input type="text" name="userName" class="name"><br/>
密码:<input type="password" name="password" class="pass"><br/>
生日:<input type="date" name="birthday" class="birth"><br/>
<input type="submit" class="sub" value="提交">
</body>
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script type="text/javascript">
$(".sub").click (
function() {
$.ajax({
url:"/struts2-02/json/test",
data:{},
dataType:"json",
type:"get",
success:function(data){
console.log(data);
// 但是这里得到的是json字符串
// 而前端要获取的 一般是json对象
// 所以前端需要将这个字符串转化为json对象
var d = eval("("+data+")")
console.log(d);
console.log(d.userName);
}
})
}
)
</script>
SSH三大框架
ssh为 Struts + Spring + hibernate的一个集成框架,是目前较流行的一种web应用程序开源框架
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。
Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。
轻量——从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。
控制反转——Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。
面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。
容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。
框架——Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。