看某些同学在那儿做个单表CRUD,半天还不出效果,还那儿调Bug,我的心情啊
就那么一句话,多练,实现多了自然掌握。针对于总有些自认为基础不好的同学,认为是原理没学透,底层没有掌握,所以代码不能出效果, 这时候,我经常跟这些同学打个比喻,来给我解释解释自行车的平衡原理,为什么两条腿在作圆圈运动,两个车轱辘就往前走,还居然不倒?我相信,你百度半天,肯定能找到对应文章,好,你把这些文章组织组织,找个不会骑自行车的人,你让他看,给他讲这个平衡原理,给他看视频,给他说,让他背原理,然后你让他骑,你看他会不会!!!
所以说其实单表CRUD就是经常操作,多写,多出Bug,多DeBug。边实践边总结,那么废话不多说,下面是一贯的怼代码,咱们的目标:不会写代码的厨子不是好司机。让厨子一看也能实现效果
好先来张图说下最终效果的目录结构,一定要瞧好目录结构!!!
要说传统项目就是配置文件最麻烦,但是谁说让你背下来了!!!哎呦。。。
这个工程可以看到一共4个配置文件,6个类文件,还有pom文件一个
pom坐标,这东西你乐意背,你背吧。
4.0.0 cn.wfb.demo ssh_demo1.0-SNAPSHOT war UTF-8 1.8 1.8 com.alibaba fastjson1.1.37 org.hibernate hibernate-core5.3.1.Final org.apache.struts struts2-core2.5.14.1 org.apache.struts struts2-spring-plugin2.5.14.1 org.apache.struts struts2-convention-plugin2.5.14.1 org.apache.struts struts2-json-plugin2.5.14.1 org.springframework spring-core5.0.6.RELEASE org.springframework spring-context5.0.6.RELEASE org.springframework spring-jdbc5.0.6.RELEASE org.springframework spring-beans5.0.6.RELEASE org.springframework spring-web5.0.6.RELEASE org.springframework spring-expression5.0.6.RELEASE org.springframework spring-orm5.0.6.RELEASE cglib cglib3.2.6 org.aspectj aspectjrt1.9.0 org.aspectj aspectjweaver1.9.0 mysql mysql-connector-java5.1.16 com.mchange c3p00.9.5.1 org.springframework spring-test5.0.6.RELEASE test javax.servlet servlet-api2.5 provided org.apache.maven.plugins maven-compiler-plugin2.3.2 1.8 1.8 org.apache.tomcat.maven tomcat7-maven-plugin2.2 8080 /
其中包括启动就加载的web.xml,
org.springframework.web.context.ContextLoaderListener contextConfigLocation classpath:applicationContext.xml openSessionInView org.springframework.orm.hibernate5.support.OpenSessionInViewFilter openSessionInView @Entity //实体类注解 public class TScore { @Id //主键注解 private Integer id; private String name; private String subject; private String fraction; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSubject() { return subject; } public void setSubject(String subject) { this.subject = subject; } public String getFraction() { return fraction; } public void setFraction(String fraction) { this.fraction = fraction; } }
dao层接口
package cn.wfb.dao;
import cn.wfb.entity.TScore;
import java.util.List;
public interface ScoreDao {
List findAll();
void add(TScore score);
}
dao实现类
package cn.wfb.dao.impl;
import cn.wfb.dao.ScoreDao;
import cn.wfb.entity.TScore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate5.HibernateTemplate;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository //这个注解能少吗?
public class ScoreDaoImpl extends HibernateDaoSupport implements ScoreDao {
@Autowired
private HibernateTemplate hibernateTemplate;
@Override
public List findAll() {
TScore dept = new TScore(); //可以根据对象条件进行查询
return hibernateTemplate.findByExample(dept);
}
@Override
public void add(TScore score) {
hibernateTemplate.save(score);
}
}
service接口
package cn.wfb.service;
import cn.wfb.entity.TScore;
import java.util.List;
public interface ScoreService {
List findAll();
void add(TScore score);
}
service实现类
package cn.wfb.service.impl;
import cn.wfb.dao.ScoreDao;
import cn.wfb.entity.TScore;
import cn.wfb.service.ScoreService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class ScoreServiceImpl implements ScoreService {
@Autowired
private ScoreDao scoreDao;
@Override
public List findAll() {
return scoreDao.findAll();
}
@Override
public void add(TScore dept) {
scoreDao.add(dept);
}
}
controller类
package cn.wfb.controller;//返回jsp页面采用下面配置
import cn.wfb.entity.TScore;
import cn.wfb.service.ScoreService;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Controller(value = "scoreAction")//用于标注控制层组件(如struts中的action)
@Scope("prototype")//单列模式
@ParentPackage("struts-default")
@Namespace("/")
public class ScoreAction extends ActionSupport {
// 引入Service
@Autowired
private ScoreService scoreService;
//这个实体类和get,set方法是为了接收到请求传入的对象,关于这个需要研究Struts传值问题
//前端采用表单提交方式score.name属性,记得几个属性都要赋值啊。因为数据库属性你自己好好看看!!
private TScore score;
public TScore getScore() {
return score;
}
public void setScore(TScore score) {
this.score = score;
}
@Action(value = "list")
public void list() {
List deptList = scoreService.findAll();
//已经不用jsp了,所以考虑返回json数据
write(deptList);
}
@Action(value = "add")
public void add() {
try {
scoreService.add(score);
Map result = new HashMap<>();
result.put("success",true);
result.put("message","add ok");
write(result);
} catch (Exception e) {
e.printStackTrace();
Map result = new HashMap<>();
result.put("success",false);
result.put("message","add error");
write(result);
}
}
public void write(Object object) {
//对象转json,并取消循环引用
String jsonString = JSON.toJSonString(object, SerializerFeature.DisableCircularReferenceDetect);
//获取response设置头信息及编码格式
HttpServletResponse response = ServletActionContext.getResponse();
response.setHeader("Content-type", "text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
try {
//写出
response.getWriter().print(jsonString);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
效果出来了,Bug不要怕,出了Bug我们就可以Debug,多快乐啊,要没有Bug,我们创造Bug,然后集中力量解决Bug!!!这调调熟悉不?
查询,新增,亲测效果如图,童叟无欺。赶紧cv大法试一试吧。马上精通SSH,开心不。
每日论点:
我总能听到,前端好还是后端好,(就跟移动端都死翘翘了一样,哎。。。)。好吧,我只能说,没有后端前端做毛逻辑,前端面对的是产品经理,来看一下,产品经理每天都拽着美术设计干嘛呢~。。
当然产品们跑过来让前端来几套皮肤烘托节日气氛,是常有的事,哈哈哈哈。这时候我奉劝做后端的小伙伴,千万不要鲁莽的评论前端效果的好与坏,反正不是后端写的,还是猥琐发育吧,后端同学们。
折腾完前端的产品经理,碰到出来喝咖啡的后端。。。。
前端光鲜亮丽,后端撅着大腚写逻辑,谁都离不开谁。他们面对产品经理更多一些,毕竟产品耍嘴皮的多不太懂技术。要求图标左右上下的动,有时候还要带旋转效果,再来个奔放红啥的,折腾前端多些。后端被折腾无非就是变态需求来回改,这帮子老改犯的产品。前后端其实都是一帮掉头发的职业玩。。。
支付宝扫一扫得红包
你的支持是我的动力
欢迎关注公众号:魏凡缤Java技术文章



