要解决最最基本的问题自我总结有三个:
1.怎么样把数据从前端传至后台;
2.怎么样把从数据库拿到的数据显示到前端web页面;
3.怎么样把所需的数据从数据库取出;
所用为Springmvc框架,所用的案例是上学期的购物车;
- .xml文件内是从数据库拿数据的语句;
- mapper文件是封装从数据库拿到的数据,即Dao层
- contorll控制层,是把封装在Dao层的数据,用各种方法显示到前端web界面
所需的知识,涉及
jquery,jave se,html5,Mysql,javesrcipt
塞一点问题以后要是遇到了可以自己看看:
1.不能自动装配的问题(@Autowired)
在Dao层上加上@Repository注解
2.为什么要有server层,为什么不能直接用Dao层,干嘛要多此一举?(未解决)
3.@RestController和@Controlller的区别
@RestController注解相当于@ResponseBody + @Controller合在一起的作用。
@ResponseBody 返回json和xml内容到页面时,需要加上这个注解
4.为什么不能兼容返回网页和xml内容?答:可以,但是注解不能注解在类上,要注解在具体方法上。
5.怎么样把数据库内容通过数据绑定到前端?
1.用a标签,直接用请求地址进行访问(但是感觉有点傻逼?)
2.记得有些用th标签的(补:没错,可以用。
比如 th:text="${item.sku_info.product_class_name}
————————————————2019.7.09———————————————————
1.数据库语句查询的是一些数据,为什么,封装到model后就变得不是我所想要的数据了,变成了奇怪的字段。
答:返回的是地址,如果需要返回的是所需数据需要在实体类里面加上toString()的方法,然后在控制层加上for循环list,才能够实现。如下:
List<User_info> hhh = test_infoService.test2();
for (User_info userInfo : hhh){
System.out.println(userInfo.toString());
}
model.addAttribute("AllUers",hhh);
System.out.println("model 是"+ model);
return "success";
输出结果变为我想要的数据了:
User_info{user_id=1, pwd='123456', user_name='企业应用泰斗', user_real_name='唐红军', telephone='18966165637', card_id='432923197906116518', user_pro='教育', address_infoList=null}
model 是{AllUers=[User_info{user_id=1, pwd='123456', user_name='企业应用泰斗', user_real_name='唐红军', telephone='18966165637', card_id='432923197906116518', user_pro='教育', address_infoList=null}]}
2.关于前缀后缀的配置问题(待解决)具体问题可以体现在,怎么样用.jsp页面
3简单的数据绑定
(1).通过HttpServletRequest类型来绑定,并通过该对象的getParameter()方法获取来指定的参数。
@RequestMapping(value = "/selectUser")
public String selectUser(HttpServletRequest request){
String id = request.getParameter("id");
System.out.println("id ="+id);
return "test.html";
}
(2).利用Spring mvc 提供的@RequestParam注解来进行绑定
@RequestMapping(value = "/selectUser")
public String selectUser(@RequestParam(value = "id")Integer id){
System.out.println("id ="+id);
return "test.html";
}
4.绑定pojo类型的数据(pojo就是一个类,问题就可以转化为怎么传入多条数据到后太)
方法可以用以上的俩个方法
//User实体类
public class User {
private Integer id;
private String username;
private Integer password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Integer getPassword() {
return password;
}
public void setPassword(Integer password) {
this.password = password;
}
}
//Controller类里面的具体方法
@RequestMapping(value = "/toregister")//跳转到去注册的页面(test页面)
public String toregister(){
return "test.html";
}
@RequestMapping(value = "/register")//给表单提交的时候用的
public String registerUser(User user){
String username = user.getUsername();
Integer password = user.getPassword();
System.out.println("username="+username);
System.out.println("password="+password);
return "success.html";
}
//前端的提交的表单
<form action="/register" method="post">
用户名:<input type="text" name="username"><br>
密码: <input type="text" name="password"><br>
<input type="submit" value="注册">
</form>
拿到的结果如下:
username=1
password=1
5.解决完昨天自己提出的3个大问题,现在有新的大问题了
从前端拿到数据后完应该怎么对数据进行操作,比如进行用前端拿来的数据,用于修改数据库(对数据库的增删改查?)
将数据封装到model中,该如何把model里的数据,用到网页上
拦截器的使用
————————————————2019.7.10———————————————————
1:已将数据封装到model中,该如何把model里的数据,用到前端页面上
利用Thymeleaf来把model数据绑到前端:
前端代码
<div th:each="users:${selectusers}">
<div th:text="${users.user_id}"></div>
<div th:text="${users.pwd}"></div>
<div th:text="${users.user_name}"></div>
<div th:text="${users.user_real_name}"></div>
</div>
//后台的model的封装
@RequestMapping(value = "/showall2")
public String test2(HttpServletRequest request,Model model){
List<User_info> hhh = test_infoService.test2();
for (User_info userInfo : hhh){
System.out.println(userInfo.toString());
}
model.addAttribute("selectusers",hhh);
System.out.println("model 是"+ model);
return "test";
// return test_infoService.test1();
}
结果如下:
1
123456
企业应用泰斗
唐红军
(ps:确实把我用数据库查询到的数据放到前端上了,但是太丑了,接下来稍微存个表格。)
2.jquery和javasript区别
jQuery是一个JavaScript函数库。jQuery就是基于JavaScript语言写出来的一个框架,实质上还是JavaScript而已。
jQuery 极大地简化了 JavaScript 编程,jQuery代码比沉重的JavaScript轻灵多了,jquery设计的初衷就是要用更少的代码,漂亮的完成更多的功能
3.今日事,
(1)把整个流程在走一遍,熟悉一下代码;
(2)拦截器的使用(实现一个登录)
(3)前端对数据库的操作
拦截器的使用,拦截的是登录状态,如果没有登录,则跳转到登录界面,如果已经登录,则可以正常进行。
可以用注解的方式进行拦截;
在这之前,先把登录给写完;
登录的想法:
前端把用户输入的数据传入后台,即user_id和pwd;
后台把前端数据接受,并通过数据库语句,把拿来的数据与数据库User_info表中对比,如果查询到,跳转到首页,如果没有查询到,返回登录界面。
数据库把前端传的数据进行与数据库比对
前端:
<form action="/checklogin2" method="post">
账号是: <input type="text" name="user_id" placeholder="请输入账号"><br>
密码是: <input type="text" name="pwd" placeholder="请输入密码"><br>
<button type="submit">提交</button>
</form>
控制层:
@RequestMapping(value = "/checklogin2")
public String checklogin2(HttpServletRequest request,User user){
String user_id = request.getParameter("user_id").toString();
String pwd = request.getParameter("pwd").toString();
System.out.println(user_id);
System.out.println(pwd);
User_info user_info = test_infoService.checklogin2(user_id,pwd);
// List<User_info> h = (List<User_info>) test_infoService.checklongin2(user_id,pwd);
System.out.println(user_info);
/*if ("admin".equals(user_id)&& "123456".equals(pwd))
return "success";
else {
return "test_login";
}*/
if (user_info == null)
return "login";
else {
return "success";
}
}
数据库:
<select id="checklogin2" resultType="com.mall.entity.User_info">
select * from user_info where user_id = #{user_id} and pwd = #{pwd}
</select>
service层:
public User_info checklogin2(String user_id, String pwd) { return test_infoMapper.checklogin2(user_id, pwd);}
Mapper层:
public User_info checklogin2(@Param("user_id") String user_id,@Param("pwd") String pwd);
前台页面:
查询到的数据:
2.extends 和 implements的区别不能 嘛,
extends 是继承父类,只要那个类不是声明final或者定义为abstract就能继承,JAVA中不支持多重继承,继承只能继承一个类,但implements可以实现多个接口,用逗号分开就行了。
3.发现了自己有一块地方好像是以前学习Java的盲区,关于继承的问题,好像了解的不深,但最近发现使用较多,下周找机会查漏补缺一下。
————————————————2019.7.12———————————————————
新的一周,学习目标如下
javase :
继承和面对对象的思想的知识进行补充
书看到202页,形参和实参的概念,了解各种传值的方式
接下来是数组的知识,了解怎么把数组当返回值传回。
jquery:
选择器的使用
选择器就是,根据div,p等各种html的标签来选择该对象,从而进行具体操作,和javasript里面根据标签的id来进行选择是同一个东西。但是jquery提供的选择非常多,而且代码简单,应该就是把js语句进行了封装。
具体语法:$(“xxx”),xxx可以是属性,元素的name,id等进行选择
能做的事情便和就是差不多了,修改元素属性等等
监听器的使用
监听某个组件键盘按下事件,例如监听id为btn的button组件的回车按下事件
$("#btn").keydown(function(event){
if(event.keyCode == 13){
alert('你按下了Enter');
}
});
详细keyCode值列表:
类似的还有,鼠标的监听器;以后要用的时候在深入看把。
javaee :
关于拦截器的使用
session和cookie的了解(询问)
thymeleaf 实现简单分页
实现基本的增删改查
注册的实现:
用user_id判断数据库中,是否已经有了该条数据,如果有跳转到错误界面,如果没有,把前端传入的user_id和pwd作为参数传到后台,执行数据库添加语句。
前端页面:
<form action="/register" method="post" style="margin-left: 30%;margin-top: 30%;margin-right:30%;background-color: #00b0ff">
用户名:<input type="text" name="user_id">
密码: <input type="text" name="pwd"><br>
<input type="submit" value="注册">
</form>
控制层:
@RequestMapping(value = "/toregister")
public String toregister(){
return "register";
}
@RequestMapping(value = "/register")
public String registerUser(User_info user_info){
Integer user_id= user_info.getUser_id();
String pwd = user_info.getPwd();
System.out.println("username="+user_id);
System.out.println("password="+pwd);
if (test_infoService.findbyid(user_id)==null){
test_infoService.register(user_id,pwd);
return "success.html";
}
else {
System.out.println(test_infoService.findbyid(user_id));
return "error.html";
}
}
Mapper层:
public User_info register(@Param("user_id") int user_id,@Param("pwd") String pwd);
public User_info findbyid(@Param("user_id") int user_id);
Sevice层:
public User_info register(int user_id,String pwd){return test_infoMapper.register(user_id,pwd);}
public User_info findbyid(int user_id){return test_infoMapper.findbyid(user_id);}
结果如下:
点击注册后,如果用户名已经存在于数据库中,就跳转到错误页面,如果没有,则注册成功。
至此,基本的增删改查注册登录已经没有问题了。可以考虑加深难度了。
————————————————2019.7.15———————————————————
周二:
了解API接口的问题
能够实例一个具体最基本的api
Java jdk sdk api的区别
JDK:Java 开发工具包
SDK:软件开发包
API :应用程序接口
API理解为自己写的函数,进行封装,可以被自己调用或者他人调用,比如登录是,前端登录的时候,验证登录就要调用自己写的函数,这个函数就叫API,这个动作叫API的调用。怎么解决不是自己的函数的调用,需要研究。首先研究一下返回值是什么东西,json什么的。
有多少种方法把数据从前端传到后台:
1.HttpServletRequest request
2.@RequestParam(value = “xx”)
3.直接传递
有多少种方法把后台数据显示到前端
@ResponseBody的作用其实是将java对象转为json格式的数据
————————————————2019.7.16———————————————————
把图片显示到前端
俩种图片,一种在服务器上的图片,一种是本地图片
HttpServletResponse,HttpServletRequest详解
File 的流类
FileInputStream概念 :FileInputStream流被称为文件字节输入流,意思指对文件数据以字节的形式进行读取操作如读取图片视频等
输入流是把数据从别的地方读入本程序的内存
输出流则是把数据从本程序的内存写到别处
划分输入/输出流是从程序运行时所在的内存考虑的,读入内存是输入,读出内存是输出。
并且输入流只能读数据,输出流只能写数据!也就是说输入和输出流都是单向的!
ava IO之字节流和字符流-OutputSteam和InputStream
https://blog.csdn.net/fengshizty/article/details/41245129
//测试FileInputStream输入流
public static void main(String[] args) {
/* Scanner kb = new Scanner(System.in);
String pwd = kb.next();
hh(pwd);*/
File file = new File("/Users/wuzuowei/Desktop/1.png");
try {
FileInputStream fileInputStream = new FileInputStream(file);
System.out.println("找到了");
}
catch (FileNotFoundException e){
System.out.printf("找不到路径");
}
}
java.io.OutputStream.flush() 方法刷新此输出流并强制将所有缓冲的输出字节被写出。
java IO之字节流和字符流-OutputSteam和InputStream
https://blog.csdn.net/fengshizty/article/details/41245129
从本地或服务器上取图片或者视频
@RequestMapping("/getImage")
@ResponseBody
public void getImagesId(HttpServletResponse rp) {
String filePath = "/Users/wuzuowei/Desktop/mall(期末大作业)/src/main/resources/templates/res/static/img/hot1.png";
//创建新的File实例
File imageFile = new File(filePath);
if (imageFile.exists()) {
FileInputStream fis = null;
OutputStream os = null;
try {
//FileInputStream输入流
fis = new FileInputStream(imageFile);
os = rp.getOutputStream();
int count = 0;
//建立一个1MB的缓冲区
byte[] buffer = new byte[1024 * 8];
//把数据写入缓存区
while ((count = fis.read(buffer)) != -1) {
os.write(buffer, 0, count);
//刷新此输出流并强制将所有缓冲的输出字节被写出
os.flush();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
//关闭输入输出流,释放占用资源
fis.close();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
调用俩种方法:
1.浏览器地址请求上加/getImage
2.在前端img标签src属性里加上/getImage
问题遗留:这样子好像只能一次一张,如果想要一次性多张呢?
老师解法,把图片路径放到数据库中,在前端中循环一下,其中最不会的应该是数据库的多表查询
mysql的多表联结查询,补一个网址:https://blog.csdn.net/m0_37888031/article/details/80632268
————————————————2019.7.17———————————————————
…
…
…
写项目去了,昨天大概又了解了公司的构架,action层负责与前台交互,往下是接口层,定义一些接口,然后再到实现类实现方法,然后在到dao层的接口,再到dao层的实现类,在到数据库执行语句。
然后就是需求理解错了,写了好几天都是白写的我。断更了,以后学到在更
经过大概一个星期的时间的努力,我终于做完了需求,虽然最后都不是我做的,但是这的的确确使我对spring的理解上了一个层面,最困扰我的前端react也搞完了,虽然也不是我做的,但是我也对他有了一点理解。现在当下正火的前端框架,vue,react,AngularJS,我觉得很有必要都去了解一下,但是没有必要全都精通,起码最简单的对接需要会,然后关于数据的处理问题,这个需要重点去了解一下,好像我并不会。
续更,今日学了文件的上传和下载
上传就是从前台传回所选的路径来进行上传,利用MultipartFile这个类来进行上传,调用了其中几个方法;
//对单个文件的上传
@RequestMapping(value = "/upload",method = RequestMethod.POST)
@ResponseBody
public String upload(@RequestParam("file") MultipartFile file){
if (file.isEmpty()){
System.out.println("没有找到file目录");
return "error";
}
int filesize =(int)file.getSize();
String filename = file.getOriginalFilename();
System.out.println(filename +"的大小是 "+filesize+"字节");
String path ="/Users/wuzuowei/Desktop";
File dest = new File(path+"/"+filename);
if (!dest.getParentFile().exists()){//判断父目录是否存在
dest.getParentFile().mkdir();
}
try {
file.transferTo(dest);//**********保存文件语句*************
return "ture";
} catch (IOException e) {//处理输入输出异常
e.printStackTrace();
} catch (IllegalStateException e){//处理状态无效异常
e.printStackTrace();
}
return "success";
}
下载
//对单个文件的下载
@RequestMapping(value = "/download")
@ResponseBody
public String download(HttpServletResponse response) throws UnsupportedEncodingException{
String filename= "" ;
String filepath= "/Users/wuzuowei/Desktop";
File file = new File(filepath+"/"+filename);
if (file.exists()){
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
response.setCharacterEncoding("UTF-8");//防止中文乱
response.setHeader("Content-Disposition", "attachment;fileName=" + java.net.URLEncoder.encode(filename,"UTF-8"));
byte[] buffer = new byte[2048];
FileInputStream fis = null;
BufferedInputStream bis = null;
OutputStream os = null;
try{
os = response.getOutputStream();
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
int i = bis.read(buffer);
while(i != -1){
os.write(buffer);
i = bis.read(buffer);
}
}catch (IOException e) {
e.printStackTrace();
}
System.out.println("----------file download---" + filename);
try {
bis.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return "success";
}