Jave ee 自学经历(2019.7.09)

要解决最最基本的问题自我总结有三个:
1.怎么样把数据从前端传至后台;
2.怎么样把从数据库拿到的数据显示到前端web页面;
3.怎么样把所需的数据从数据库取出;

所用为Springmvc框架,所用的案例是上学期的购物车;

  1. .xml文件内是从数据库拿数据的语句;
  2. mapper文件是封装从数据库拿到的数据,即Dao层
  3. 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">&nbsp;&nbsp;
    密码:  <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";
    }

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值