02.搭建SSH
1.创建项目
在Eclipse中创建项目,右键解决报错即可导入MyEclipse中,防止Myeclipse中总是报错问题(注意jdk版本问题)
2.导包:
<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,配置了一个转发器和编码过滤器
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)注意扫描位置
注意:此配置文件尚未完善需要完善,主要是读取配置文件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");