发表于: 2017-10-14 23:11:25

1 759


今日完成:

  昨天问题已经解决,首先原来使用代码如下

@Autowired
private SqlSessionFactory sqlSessionFactory;

public void add(Emp emp){
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.insert("test.emp.add", emp);
sqlSession.commit();
sqlSession.close();

}

这样是从IOC中取出SqlSessionFactory,在tomcat启动后,SqlSessionFactory实例化,SqlSessionFactory实现的是SqlSesssionFatoryBean子类,在每一次进行增删改查时,都会通过openSession来从连接池里取出一个连接

这里原因,sqlSession.close()提交后,连接仅在该方法内关闭,取出的连接并没有被连接池回收,造成连接池被占满状态,从而增删改查服务器会一直等待响应!

解决方案如下

<!--spring和Mybatis整合-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" scope="prototype">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:mybatis.xml"></property>
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>

整合后的使用SqlSessionTemplate来直接注册sqlSession,这样就既避免了我连接无法提交关闭而造成连接池被占满,又简化了Dao层代码,避免了重复的commit提交操作,和close关闭请求操作!

@Autowired
private SqlSession sqlSession;

public void add(Emp emp){
sqlSession.insert("test.emp.add", emp);
}

这样在调用sqlSession.insert就等同于调用SqlSessionTemplate.insert,其内部调用sqlSessionProxy.insert,sqlSessionProxy是一个动态代理器,其调用处理器是SqlSessionInterceptor,该处理器先getSqlSession,然后执行insert,最后closeSqlSession。

经测试,OK!

但是,这边整合框架时我参考了ssh框架整合,dao层处理的这种方式在常见ssm框架整合中,很是非主流....所以出了问题解决起来很吃力,这里dao层采用常规方式再次进行整理.

这里也先推荐非常好的一篇博客,讲的是非常清晰透彻!

http://blog.csdn.net/zhshulin/article/details/37956105

这里重写了Dao,并在配置文件中添加扫描注入

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--注入SqlSessionFactory-->
   <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!-- 给出需要扫描的Dao接口-->
   <property name="basePackage" value="cn.ssm.dao"/>
</bean>
public interface MybatisDao {
public void add(Emp emp);
public void delete(Emp emm);
public void update(Emp emp);
public List<Emp> findAll();
public Emp findById(int id);
public Emp findByEmp(Emp emp);
}

这里要注意的是映射文件中的namespace要对应dao java文件的路径,方法id要对应dao中方法名称,这里测试欧克!

@Service
public class MybatisService {
@Autowired
   private MybatisDao mybatisDao;

public void add(Emp emp){
mybatisDao.add(emp);
}
public void delete(Emp emp){
mybatisDao.delete(emp);
}
public void update(Emp emp){
mybatisDao.update(emp);
}
public List<Emp> findAll(){
return mybatisDao.findAll();
}
public Emp findById(int id){ return mybatisDao.findById(id);};
public Emp findByEmp(Emp emp){ return mybatisDao.findByEmp(emp);};

}

这里controller中也尽量使用了restful风格代码如下

@Controller
@RequestMapping(value = "/Desk")
public class FirstDemo {

@Autowired
   public MybatisService mybatisService;


//处理注册请求后跳转至登录页面
   @RequestMapping(value = "/Emp",method = RequestMethod.POST)
public String addEmp(Emp emp){
if (emp!=null){
mybatisService.add(emp);
}
return "redirect:/login.jsp";
}

//处理登录成功后跳转到展示方法
   @RequestMapping(value = "/Emplogin",method = RequestMethod.POST)
public String login(HttpServletRequest request,Emp emp){
String str = "/login.jsp";
try {
Emp temp = mybatisService.findByEmp(emp);
if (temp!=null) {
//验证登录成功后,将temp放入session域中
               request.getSession().setAttribute("emplogin",emp);
str = "/Desk/EmpList";
}
}catch (Exception e){}
return str;
}

//展示方法,获取所有用户并跳转至展示页面
   @RequestMapping(value = "/EmpList")
public String listEmp(Model model,HttpServletRequest request){
List<Emp> list = mybatisService.findAll();
model.addAttribute("emplist", list);
return "/WEB-INF/list.jsp";
}

//处理跳转至更新页面请求
   @RequestMapping(value = "/Emp/UpdateUI",method = RequestMethod.GET)
public String updateUI(Model model,int id){
Emp emp = mybatisService.findById(id);
model.addAttribute("emp",emp);
return "/updateUI.jsp";
}

//处理更新请求并跳转至展示方法
   @RequestMapping(value = "/Emp/Update",method = RequestMethod.POST)
public String updateEmp(Model model,Emp emp){
mybatisService.update(emp);
return "/Desk/EmpList";
}

//处理删除用户请求并跳回展示方法
   @RequestMapping(value = "/Emp/Delete",method = RequestMethod.GET)
public String deleteEmp(int id){
Emp emp = mybatisService.findById(id);
mybatisService.delete(emp);
return "/Desk/EmpList";
}
}


至此,ssm框架 简陋配置完成!

步骤4完成

步骤5 http://blog.csdn.net/u011054333/article/details/50958486

按照该博客下 先加载jetty插件,再配置jetty内容

<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.3.7.v20160115</version>
<configuration>
<httpConnector>
<port>8080</port>
<host>localhost</host>
</httpConnector>
<scanIntervalSeconds>1</scanIntervalSeconds>
</configuration>
</plugin>

一次性成功!

这里已经移除了tomcat服务器哦.

虽然jetty作用相当于tomcat但是还是阐述一下什么是jetty

Jetty 是一个开源的servlet容器,它为基于Java的web容器,例如JSP和servlet提供运行环境。Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行(stand-alone)的Java应用提供网络和web连接。


除此外使用常规的使用idea部署到jetty,下载压缩包解压到d盘下.

添加文件

添加项目至jetty服务器中.

关于jetty和tomcat的区别还有底层实现,https://www.ibm.com/developerworks/cn/java/j-lo-jetty/ 这篇11年的文章将的很好,只啃了一点点


步骤6 这里先是使用了Postman 进行测试,https://zhidao.baidu.com/question/1241375008598742699.html安装教程如下.还是比较麻烦的.

页面测试想当友好,在post请求,参数内容添加在body中. 但就目前感受来看,方便在于一次请求操作后会被保存在History历时记录中,调试过程中省去了一直开web浏览器重新输入的麻烦的其他功能还有待学习使用!

DHC测试类似,但就友好度来说postman更加好一点,用起来也舒服一点.



明日计划:完成深度思考,再再再回顾rest

问题:无

收获:新服务器的学习部署,及接口测试工具!



返回列表 返回列表
评论

    分享到