#这是一个关于新手的ssh项目,以及首次对ssh的配置启动复盘#
1.项目结构介绍
1.1大致结构图展示
1.2整体说明
1.2.1:配置
ssh项目使用maven,在pom.xml中将ssh相关插件进行配置,当然,不管使 用maven还是直接下载ssh三部分的相关插件通过导入的方式进行ssh环境配置,其最终结果都是ssh环境的配置,不过要注意的是使用maven 需要注意版本一致性,否则会报错,很麻烦
即:
1.2.2:大致分类
整体分为java包,resource包,以及前端jsp的web包
2.项目运行过程
2.1服务器启动
服务器启动,一般也就是当你启动Tomcat(应用服务器软件,也可以说是中间件,也可以说是Servlet容器,Web服务器)时
实例化Struts2控制器时,加载struts.xml,struts-default.xml,等相关struts文件
实例化Spring容器时,加载applicationContext.xml
2.2浏览器请求
客户浏览器发送请求,请求到达Struts2的Filter控制器,如果是Action请求,Struts2控制器根据struts.xml的配置, 要调用一个Action对象处理
如例:
当运行该jsp文件,点击提交按钮后,请求是action请求,则Struts2的Filter控制器就会根据struts。xml配置文件
如图:
会根据你的action找到name ="addTeacher"的action,根据所在的class属性值,从而找到所在的类,这里会执行method 属性值里的方法,也就是说执行如图AddTeacherAction类的execute方法,执行这个方法,会return 结果,之后就根据return 的结果跳转相应的jsp界面
2.3部分代码执行机制
接上,细说,当执行了如图AddTeacherAction类的execute方法会发生什么?
即:
这里的主要就是 teacherService.addTeacher(teachinfo);这一代码,
那么如果我要实现添加信息,那么teacherService.addTeacher(teachinfo)括号里面的“teachinfo”就是前端jsp界面用户输入的信息了吧,可是前端用户输入的信息是如何传到这里的呢?
解释:当提交后,提交的信息会由 Struts2中的拦截器(interceptors)在Action执行之前处理HTTP请求数据。默认情况下,Struts2使用params
拦截器,它会将请求参数映射到Action类的属性中,这里我用了Teachinfo teachinfo=new Teachinfo();
当表单提交时,params
拦截器会将输入字段的值填充到teachinfo
对象的相应属性中。然后,AddTeacherAction
类的execute
方法会被调用,teachinfo
对象已经包含了从前端传递来的属性值。
2.4部分代码执行结果
调用teacherService.addTeacher(teachinfo),其运行逻辑就是将把封装在teachinfo内的信息,导入数据库
3.spring实现
3.1applicationContext.xml配置文件分析
<?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:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mappingResources">
<list>
<value>Teachinfo.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQL5Dialect
</prop>
</props>
</property>
</bean>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/strutstest1"/>
<property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
<property name="user" value="root"/>
<property name="password" value="@y123456"/>
</bean>
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 事务管理器配置 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 启用注解驱动的事务管理 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="teacherDaoBean" class="p1.dao.TeacherDaoBean">
<property name="hibernateTemplate" ref="hibernateTemplate"/>
</bean>
<bean id="teacherService" class="p1.service.TeacherService">
<property name="teacherDaoBean" ref="teacherDaoBean"/>
</bean>
<bean id="addTeacherAction" class="p1.action.AddTeacherAction">
<property name="teacherService" ref="teacherService"/>
</bean>
<bean id="deleteTeacherAction" class="p1.action.DeleteTeacherAction">
<property name="teacherService" ref="teacherService"/>
</bean>
<bean id="findTeacherAction" class="p1.action.FindTeacherAction">
<property name="teacherService" ref="teacherService"/>
</bean>
<bean id="lookTeacherAction" class="p1.action.LookTeacherAction">
<property name="teacherService" ref="teacherService"/>
</bean>
<bean id="updateTeacherAction" class="p1.action.UpdateTeacherAction">
<property name="teacherService" ref="teacherService"/>
</bean>
</beans>
如上分为三个部分,
3.1.1对于 <bean>属性见解
id:唯一标识符 也就是说如果把<bean>比作一个人的话,那么id 就是它的名字,不可重复,也就是多个<bean> 不可重名,要不然进行ref="id"时,谁知道到底依赖的是哪一个<bean> class
class:该属性在Spring配置文件中用于指定要实例化的具体类
name:就是把class类里面的name 属性进行赋值
ref:一般是赋值内容 ,ref就是(依赖)用别的<bean>里面的值
3.1.2具体举例理解(就是spring ioc 的setter注入)
<bean id="addTeacherAction" class="p1.action.AddTeacherAction">
<property name="teacherService" ref="teacherService"/>
</bean>
这里我要对路径p1.action.下的AddTeacherAction类进行实例化(这里的实例化就是把ref="teacherService"的属性值传给name="teacherService"),那么name="teacherService"如何接收的呢?
如图
name="teacherService"里的teacherService对应的就是图中的teacherService。 set方法接受的
总的来说就是setter注入
3.1.3接着分析applicationContext.xml
<bean id="addTeacherAction" class="p1.action.AddTeacherAction">
<property name="teacherService" ref="teacherService"/>
</bean>其注入属性值依赖于ref="teacherService",
找到id=teacherService的bean
即
<bean id="teacherService" class="p1.service.TeacherService">
<property name="teacherDaoBean" ref="teacherDaoBean"/>
</bean>
而其值又依赖id=teacherDaoBean的Bean
即
<bean id="teacherDaoBean" class="p1.dao.TeacherDaoBean">
<property name="hibernateTemplate" ref="hibernateTemplate"/>
</bean>
以此找下去...
会发现最终依赖的是
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mappingResources">
<list>
<value>Teachinfo.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQL5Dialect
</prop>
</props>
</property>
</bean>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/strutstest1"/>
<property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
<property name="user" value="root"/>
<property name="password" value="@y123456"/>
</bean>
第一个id="sessionFactory",这个是关于数据库的,第二个 id="dataSource"这个是关于数据库连接的这样不就和对数据库的操作扯上关系了,还有不要忘记了一连串的依赖,需要在其对应的类下依次进行setxxx()进行接受(实例化)
3.1.4对application.xml中事务管理器配置分析
也就是以下两段
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 启用注解驱动的事务管理 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
为什么要进行事务管理器的配置呢?
回答:事务管理器的配置是为了确保在执行数据库操作时能够保持数据的一致性和完整性。通过事务管理器,可以控制事务的开始、提交、回滚等操作,使得多个数据库操作要么全部成功要么全部失败
主要原因是运行后,报错了,大致意思就是只能进行读的操作,无法修改,所以进行注解(readOnly=false)
注解位置:
4.如上实例源码展示
<!--全码:v:ershiqijian -->
addTeacher.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<style>
.login-form {
width: 240px;
height: 350px;/*登录框大小*/
flex-direction: column;/*竖排列*/
padding: 40px;/*内边框距离*/
text-align: center;
position: relative;
z-index: 100;
border-radius: 18px;/*设置外边框圆角*/
overflow: hidden; /* 隐藏多余的模糊效果*/
background: darkcyan;
}
.container {
width: 20vw;
height: 20vh;
position: fixed;
right: 40%;
top: 20%;
}
.login-form h2 {
font-size: 18px;
font-weight: 400;
color: #ebd3d3;
}
.login-form input
{
margin: 6px 0;
height: 36px;
border: none;
background-color: white;
border-radius: 4px;
padding: 0 14px;
color: #3d5245;
}
.login-form button{
margin: 6px 0;
height: 36px;
border: none;
background-color: #09a3dc;
border-radius: 4px;
padding: 0 14px;
color: #3d5245;
}
</style>
</head>
<body>
<%@include file="TopHead.jsp"%>
<div class="container">
<form method="post" action="addTeacher"class="login-form">
<h2> 添加教师信息</h2>
<input type="text" name="id" placeholder="id"/>
<input type="text" name="name" placeholder="name"/>
<input type="text" name="sex" placeholder="sex"/>
<input type="text" name="age" placeholder="age"/>
<input type="text" name="department" placeholder="department"/>
<button type="submit">提交</button>
</form>
</div>
</body>
</html>
strtts.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<constant name="struts.objectFactory" value="spring"/>
<package name="test01" extends="struts-default">
<action name="lookTeacher" class="p1.action.LookTeacherAction">
<!-- 这里class属性值报错-->
<result name="success">lookTeacher.jsp</result>
<result name="error">/error.jsp</result>
</action>
<action name="addTeacher" class="p1.action.AddTeacherAction" method="execute">
<result name="success" type="redirect">lookTeacher.action</result>
<result name="error">/error.jsp</result>
</action>
<action name="deleteTeacher" class="p1.action.DeleteTeacherAction">
<result name="success" type="chain">lookTeacher</result>
<result name="error">/error.jsp</result>
</action>
<action name="findTeacher" class="p1.action.FindTeacherAction">
<result name="success">/updateTeacher.jsp</result>
<result name="error">/error.jsp</result>
</action>
<action name="updateTeacher" class="p1.action.UpdateTeacherAction">
<result name="success" type="chain">lookTeacher</result>
<result name="error">/error.jsp</result>
</action>
</package>
</struts>
addTeacherAction:
package p1.action;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import p1.pojo.Teachinfo;
import p1.service.TeacherService;
public class AddTeacherAction extends ActionSupport implements ModelDriven<Teachinfo> {
Teachinfo teachinfo=new Teachinfo();
TeacherService teacherService;
public TeacherService getTeacherService() {
return teacherService;
}
public void setTeacherService(TeacherService teacherService) {
this.teacherService = teacherService;
}
public String execute(){
String message="error";
teacherService.addTeacher(teachinfo);
message="success";
return message;
}
public Teachinfo getModel() {
return teachinfo;
}
}
TeacherDaoBean
package p1.dao;
import org.springframework.orm.hibernate5.HibernateTemplate;
import p1.pojo.Teachinfo;
import java.util.List;
public class TeacherDaoBean {
private HibernateTemplate hibernateTemplate;
public HibernateTemplate getHibernateTemplate() {
return hibernateTemplate;
}
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
//添加操作
public void addTeacher(Teachinfo teacher) {
hibernateTemplate.save(teacher);
}
//查询某个教师操作
public Teachinfo findTeacher(int teacher) {
Teachinfo t1 = hibernateTemplate.get(Teachinfo.class, teacher);
return t1;
}
//更新操作
public void updateTeacher(Teachinfo teacher) {
hibernateTemplate.update(teacher);
}
//删除操作
public void deleteTeacher(Teachinfo teacher) {
hibernateTemplate.delete(teacher);
}
//得到全部教师信息
public List<Teachinfo> getTeacher() {
return (List<Teachinfo>)hibernateTemplate.find("from Teachinfo ");
}
}
TeacherService
package p1.service;
import org.springframework.transaction.annotation.Transactional;
import p1.dao.TeacherDaoBean;
import p1.pojo.Teachinfo;
import java.util.List;
public class TeacherService {
private TeacherDaoBean teacherDaoBean;
public TeacherDaoBean getTeacherDaoBean() {
return teacherDaoBean;
}
public void setTeacherDaoBean(TeacherDaoBean teacherDaoBean) {
this.teacherDaoBean = teacherDaoBean;
}
@Transactional(readOnly = false)
public void addTeacher(Teachinfo teachinfo){
teacherDaoBean.addTeacher(teachinfo);
}
public Teachinfo findTeacher(int teachinfoid){
return teacherDaoBean.findTeacher(teachinfoid);
}
@Transactional(readOnly = false)
public void updateTeacher(Teachinfo teachinfo){
teacherDaoBean.updateTeacher(teachinfo);
}
@Transactional(readOnly = false)
public void deleteTeacher(Teachinfo teachinfo){
teacherDaoBean.deleteTeacher(teachinfo);
}
public List<Teachinfo> getTeacher(){
return teacherDaoBean.getTeacher();
}
}
applicationContext.xml
<?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:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mappingResources">
<list>
<value>Teachinfo.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQL5Dialect
</prop>
</props>
</property>
</bean>
<!-- 事务管理器配置 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 启用注解驱动的事务管理 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/strutstest1"/>
<property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
<property name="user" value="root"/>
<property name="password" value="@y123456"/>
</bean>
<bean id="teacherDaoBean" class="p1.dao.TeacherDaoBean">
<property name="hibernateTemplate" ref="hibernateTemplate"/>
</bean>
<bean id="teacherService" class="p1.service.TeacherService">
<property name="teacherDaoBean" ref="teacherDaoBean"/>
</bean>
<bean id="addTeacherAction" class="p1.action.AddTeacherAction">
<property name="teacherService" ref="teacherService"/>
</bean>
<bean id="deleteTeacherAction" class="p1.action.DeleteTeacherAction">
<property name="teacherService" ref="teacherService"/>
</bean>
<bean id="findTeacherAction" class="p1.action.FindTeacherAction">
<property name="teacherService" ref="teacherService"/>
</bean>
<bean id="lookTeacherAction" class="p1.action.LookTeacherAction">
<property name="teacherService" ref="teacherService"/>
</bean>
<bean id="updateTeacherAction" class="p1.action.UpdateTeacherAction">
<property name="teacherService" ref="teacherService"/>
</bean>
</beans>