02.搭建SSH

1.创建项目
在Eclipse中创建项目,右键解决报错即可导入MyEclipse中,防止Myeclipse中总是报错问题(注意jdk版本问题)
2.导包:


org.springframework
spring-webmvc
3.2.8.RELEASE


org.springframework
spring-jdbc
3.2.8.RELEASE


org.springframework
spring-orm
3.2.8.RELEASE



org.apache.struts
struts2-core
2.3.16



javassist
javassist




org.apache.struts
struts2-spring-plugin
2.3.16


org.apache.struts
struts2-convention-plugin
2.3.16



org.hibernate
hibernate-core
4.2.6.Final



mysql
mysql-connector-java
5.1.37

<dependency>
  <groupId>commons-dbcp</groupId>
  <artifactId>commons-dbcp</artifactId>
  <version>1.4</version>
</dependency>
<!--2.5 导入jstl测试包-->
<dependency>
  <groupId>jstl</groupId>
  <artifactId>jstl</artifactId>
  <version>1.2</version>
</dependency>
<dependency>
  <groupId>javax.servlet.jsp</groupId>
  <artifactId>jsp-api</artifactId>
  <version>2.2</version>
  <scope>provided</scope>
</dependency>
<!--2.6 导入junit相关的jar包-->
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
  <!-- <scope>test</scope>测试用,不复制到WEB-INF里面 -->
  <scope>test</scope>
</dependency>
<!--2.7导入文件上传和下载的jar包-->
<dependency>
  <groupId>commons-fileupload</groupId>
  <artifactId>commons-fileupload</artifactId>
  <version>1.3.3</version>
</dependency>
<!--2.8导入log4j相关的jar包-->
<dependency>
  <groupId>org.apache</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.15</version>
</dependency>
<!--2.9导入commons基础包-->
 <dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.5</version>
</dependency>
<dependency>
  <groupId>commons-lang</groupId>
  <artifactId>commons-lang</artifactId>
  <version>2.6</version>
</dependency>
<!--2.10javax/servlet/ServletContext的jar包-->
    <dependency>  
    <groupId>javax.servlet</groupId>  
    <artifactId>javax.servlet-api</artifactId>  
    <version>3.1.0</version>  
    <scope>provided</scope>  
</dependency> 
<!-- 2.11 aspectj的相关jar包-->
<dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjweaver</artifactId>
  <version>1.7.0</version>
</dependency>
<!--2.12 fastjson相关的jar包-->
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>fastjson</artifactId>
  <version>1.2.46</version>
</dependency>
注意:最后有些许插件是否考虑安装:
 <build>
<plugins>
	war插件
	<plugin>
		<artifactId>maven-war-plugin</artifactId>
	</plugin>
	<plugin>
		<artifactId>mavan-compiler-plugin</artifactId>
		<configuration>
			<source>1.7</source>
			<target>1.7</target>
			<encoding>utf-8</encoding>
		</configuration>
	</plugin>
	源码插件
	<plugin>
		<artifactId>maven-resource-plugin</artifactId>
		<configuration>
			<encoding>utf-8</encoding>
		</configuration>
	</plugin>
	javadoc插件
	<plugin>
		<artifactId>maven-javadoc-plugin</artifactId>
		<configuration>
			<encoding>utf-8</encoding>
		</configuration>
	</plugin>
	<plugin>
		<artifactId>maven-surefire-plugin</artifactId>
		<version>2.7.2</version>
		<configuration>
			<forkMode>once</forkMode>
			<argLine>-Dfile.encoding=UTF-8</argLine>
		</configuration>
	</plugin>
</plugins>

-->
3.整合Spring
添加Spring-MVC.xml的配置文件夹
见复制 F:\个人资料\总结\保存的文件\配置文件\SSH相关\spring-mvc.xml
(1)注意扫描接口包的位置base-package="com.git.user"
<context:component-scan base-package="com.git.user"></context:component-scan>
4.新建业务层接口UserService.java(位置com.git.user.service.UserService.java),定义一个测试接口方法:例如:
public interface UserService {
void test();
}
5.新建业务层接口实现类UserServiceImpl.java(位置com.git.user.serviceImpl.UserServiceImpl.java).实现接口方法,输出打印
@Service("userService")
public class UserServiceImpl implements UserService{

	public void test() {
		// TODO Auto-generated method stub
		System.out.println("测试成功");
	}

}
注意注解@Service("userService"),被Spring管理

6.新建测试类,测试Spring配置是否成功:
public class TestCase {
AbstractApplicationContext ctx;
UserService userService;
@Before
public void init(){
ctx=new ClassPathXmlApplicationContext("spring-mvc.xml");
userService=ctx.getBean("userService", UserService.class);
}
@After
public void destory(){
ctx.close();
}
@Test
public void testSpring(){
userService.test();
}
}
注意扫描文件:ctx=new ClassPathXmlApplicationContext("spring-mvc.xml");
测试是否能正常输出,如能正常输出,则spring配置成功.
7.配置web.xml并启动Tomcat.看是否报错
配置web.xml,配置了一个转发器和编码过滤器


contextConfigLocation
classpath:spring-.xml



org.springframework.web.context.ContextLoaderListener



openSessionInViewFilter
org.springframework.orm.hibernate4.support.OpenSessionInViewFilter

singleSession
true



openSessionInViewFilter
.action



struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter


struts2
*.action

8.配置Struts2的配置文件
见复制 F:\个人资料\总结\保存的文件\配置文件\SSH相关\struts.xml
9.新建UserAction.java控制器类,(位置:com.git.user.Action.UserAction.java))
测试代码如下:
(1)访问方式为/user/userAction!test.action
//ParentPackage("basePackage")被管理的包空间,对应于struts.xml中的
//
//中的name="basePackage"
@ParentPackage("basePackage")
//Namespace("/user")类似于RequestMapping("/user")
@Namespace("/user")
//Action("userAction")类似于Controller.
//其中userAction表示对整个UserAction类进行了注解,已经在struts.xml中配置了动态请求
//所以可以请求格式如/user/userAction!test.action的方式,对这个类下的test方法进行请求
@Action("userAction")
//这儿将由spring管理,是因为加载了一个插件struts2-spring-plugin
public class UserAction {
private static final Logger logger=Logger.getLogger(UserAction.class);

	public void test(){
		logger.info("进入aciton");
	}
}
注意三个注解
(2)访问方式为:/user/userAction.action
也可以这样注解:
//ParentPackage("basePackage")被管理的包空间,对应于struts.xml中的
//<package name="basePackage" extends="struts-default"></package>
//中的name="basePackage"
@ParentPackage("basePackage")
//Namespace("/user")类似于RequestMapping("/user")
@Namespace("/user")
public class UserAction {
	private static final Logger logger=Logger.getLogger(UserAction.class);
	//Action("userAction")这样注解就类似于RequestMapping("/userAction")
	//请求就可以写成/user/userAction.action
	//以后的方法重新注解即可
	@Action("userAction")
	public void test(){
		logger.info("进入aciton");
	}
}
(3)完全基于spring的注解
(有待验证完善))
如果要测试完整的上下文信息:
//ParentPackage("basePackage")被管理的包空间,对应于struts.xml中的
//<package name="basePackage" extends="struts-default"></package>
//中的name="basePackage"
@ParentPackage("basePackage")
//Namespace("/user")类似于RequestMapping("/user")
@Namespace("/user")
//Action("userAction")类似于Controller.
//其中userAction表示对整个UserAction类进行了注解,已经在struts.xml中配置了动态请求
//所以可以请求格式如/user/userAction!test.action的方式,对这个类下的test方法进行请求
@Action("/userAction")
//这儿将由spring管理,是因为加载了一个插件struts2-spring-plugin
public class UserAction {
	private static final Logger logger=Logger.getLogger(UserAction.class);
	
	@Resource(name="userService")
	private UserService userService;
	
	public void test(){
		logger.info("进入aciton");
		//如果利用上下文进行测试的话,就需要以下代码获取到对象
//		ApplicationContext ac=WebApplicationContextUtils.getWebApplicationContext(ServletActionContext.getServletContext());
//		UserService userService=ac.getBean("userService", UserService.class);
		userService.test();
		
	}
}

10.发布到Tomcat,启动Tomcat,进行action的访问localhost:8080/sshDemo/user/userAction!test.action的访问,若没有报错,则表示spring-struts整合成功
11.整合Hibernate4
11.1复制数据库连接配置文件db.properties
见复制 F:\个人资料\总结\保存的文件\配置文件\SSH相关\db.properties
11.2新建复制spring-db.xml配置文件,配置spring管理Hibernate
见复制 F:\个人资料\总结\保存的文件\配置文件\SSH相关\spring-db.xml
(1)注意<util:properties id="dbConfig" location="classpath:db.properties"></util:properties>中的location="classpath:db.properties"
(2)注意扫描位置com.git.user.model
注意:此配置文件尚未完善需要完善,主要是读取配置文件XML中的值需要完善
11.3新建dao接口,位置com.git.user.dao.UserDao.java.编写一个接口方法如下:
public interface UserDao {
public Serializable save(User user);
}
11.4新建dao接口的实现类UserDaoImpl.位置com.git.user.dao.impl.UserDaoImpl.java,实现接口方法如下:
@Service("userDao")//注解Service和注解@Repository一样
@Transactional//注解事务,必须
public class UserDaoImpl implements UserDao{
@Resource(name="sessionFactory")
private SessionFactory sessionFactory;
public Serializable save(User user) {
// TODO Auto-generated method stub
return this.sessionFactory.getCurrentSession().save(user);
}

}
(1)注意注解Service("userDao").且这个包必须被spring管理
(2)注意注解事务Transactional
(3)注意调用hibernate中的sessionFactory方法保存数据到数据库this.sessionFactory.getCurrentSession().save(user);
11.5test测试,重新添加测试方法如下:
public class TestCase {
AbstractApplicationContext ctx;
UserService userService;
UserDao userDao;
@Before
public void init(){
	ctx=new ClassPathXmlApplicationContext("spring-mvc.xml","spring-db.xml");
	userService=ctx.getBean("userService", UserService.class);	
	userDao=ctx.getBean("userDao", UserDao.class);	
}
@After
public void destory(){
	ctx.close();
}
@Test
public void testSpring(){
	userService.test();
}
@Test
public void testHibernate(){
	User user=new User();
	user.setId(UUID.randomUUID().toString());
	user.setName("小xiaoliud");
	user.setPwd("123456");
	user.setCeatedatetime(new Date());
	user.setModifydatetime(new Date());
	userDao.save(user);
}
11.6可能出现的报错有:
 (1)Error creating bean with name 'transactionManager' defined in class path resource [spring-db.xml]......
 解决方法是:检查web.xml里面是否配置这个:
  <!-- 配置openSessionInViewFilter Hibernate4需要-->
  <filter>
	<filter-name>openSessionInViewFilter</filter-name>
	<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
	<init-param>
		<param-name>singleSession</param-name>
		<param-value>true</param-value>
	</init-param>
  </filter> 
  <filter-mapping>
	<filter-name>openSessionInViewFilter</filter-name>
	<url-pattern>*.action</url-pattern>
  </filter-mapping>
  还有可能jar包不匹配,注意导入hibernate的jar包版本为4.2.6可以使用
  (2) No Session found for current thread..............
  解决方法:在spring-db.xml中的
  解放方法1:要么启动监听器配置事务
  解决方法2:如果启动注解配置事务,那么就要在UserDaoImpl上添加上注解@Transactionaler而不是serviceImpl上添加

12.最后的Action测试,添加一个action类,模拟前端访问并注册功能,添加如下方法:
public void test2(){
User user=new User();
user.setId(UUID.randomUUID().toString());
user.setName("小xiaoliudf");
user.setPwd("123456");
user.setCeatedatetime(new Date());
user.setModifydatetime(new Date());
userService.save(user);
}
删除Tomcat中的项目,重新部署进Tomcat,否则会报错,前端访问,查看数据库是否正常插入数据,如果插入了数据,则表示全部整合完成
13.配置log4j
见复制 F:\个人资料\总结\保存的文件\配置文件\log4j.properties
log4j的使用:
在类里添加:private static final Logger logger=Logger.getLogger(UserServiceImpl.class);
14.测试前端传递数据到服务器,服务器返回json数据给前端的ajax请求:代码如下:
public void test2(){
String name=ServletActionContext.getRequest().getParameter("name");
String pwd=ServletActionContext.getRequest().getParameter("pwd");
logger.info(name+";"+pwd);
User user=new User();
user.setId(UUID.randomUUID().toString());
user.setName(name);
user.setPwd(pwd);
user.setCeatedatetime(new Date());
user.setModifydatetime(new Date());
userService.save(user);
try {
Map<String,Object> map=new HashMap<String,Object>();
map.put("success", true);
map.put("msg", "注册成功");
ServletActionContext.getResponse().setCharacterEncoding("UTF-8");
ServletActionContext.getResponse().getWriter().write(JSON.toJSONString(map));;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
前端AJAX请求:

15.struts2中基于注解的访问请求:
在方法上面添加如下注解:
@Action(value="/userAction",results={
@Result(name="success",location="/web/index.jsp")
@Result(name="error",location="/web/error.jsp")
})
16.Struts2中接收前端form表单参数的传递方法有四,其中三种为:
第一种为:
private String username;
private String password;
然后get.set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
logger.info("name="+name);
User user=new User();
user.setName(name);
user.setPwd(pwd);
user.setId(UUID.randomUUID().toString());
user.setCeatedatetime(new Date());
user.setModifydatetime(new Date());
userService.save(user);
前端AJAX传输相同:
data:{
"name"😒("#name").val(),
"pwd"😒("#pwd").val()
},
第二种为,对象传递方法:
User user;

public User getUser() {
	return user;
}
public void setUser(User user) {
	this.user = user;
}
logger.info("name="+user.getName());
user.setId(UUID.randomUUID().toString());
user.setCeatedatetime(new Date());
user.setModifydatetime(new Date());
logger.info("user"+user.toString());
userService.save(user);
jsp前端AJAX传输需要这样传输,对象的属性:
data:{
	"user.name":$("#name").val(),
	"user.pwd":$("#pwd").val()
},
方法中,就自动接收到了
第三种:通过request请求的到:
String name=ServletActionContext.getRequest().getParameter("name");
String pwd=ServletActionContext.getRequest().getParameter("pwd");
posted @ 2022-09-06 22:58  NIANER2011  阅读(68)  评论(0编辑  收藏  举报