• JSD-2204-创建Spring项目-Day19


    1.创建Spring项目

     File ->new->Project

     

     点击Spring Initializr,进行配置

    ServerURL修改为:https://start.aliyun.com

    Name修改成项目的名字

    Java改为8

    Project SDK改为:1.8

    选择Web,在SpringWeb那一栏打上对勾 

    让后点击Finish

    进入项目后需要在右边的Maven那一栏点开左上角有一个刷新按钮点击一下,

    如果是第一次创建项目的小伙伴们,下载时间可能稍微长

    2.把之前写的项目部署到Spring项目中

    2.1项目目录

    2.2Java文件

    2.2.1UserController(业务逻辑层)

    1. package com.myboot.myfirstspringboot.controller;
    2. import com.myboot.myfirstspringboot.entity.User;
    3. import org.springframework.stereotype.Controller;
    4. import org.springframework.web.bind.annotation.RequestMapping;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.*;
    8. import java.util.ArrayList;
    9. import java.util.List;
    10. /**
    11. * 我创建的Controller类必须要添加注解@Controller
    12. * 并且处理某个请求的方法上要使用注解@RequestMapping
    13. */
    14. @Controller
    15. public class UserController {
    16. private static File userDir;
    17. static {
    18. userDir = new File("./users");
    19. if(!userDir.exists()){
    20. userDir.mkdirs();
    21. }
    22. }
    23. @RequestMapping("/myweb/showAllUser")
    24. public void showAllUser(HttpServletRequest request,HttpServletResponse response){
    25. List<User> userList = new ArrayList<>();
    26. File[] subs = userDir.listFiles(f -> f.getName().endsWith(".obj"));
    27. for (File userFile : subs) {
    28. try (
    29. FileInputStream fis = new FileInputStream(userFile);
    30. ObjectInputStream ois = new ObjectInputStream(fis);
    31. ) {
    32. User user = (User) ois.readObject();
    33. userList.add(user);
    34. } catch (IOException e) {
    35. e.printStackTrace();
    36. } catch (ClassNotFoundException e) {
    37. e.printStackTrace();
    38. }
    39. }
    40. System.out.println(userList);
    41. //2将数据拼接到html生成页面
    42. response.setContentType("text/html;charset=utf-8");
    43. try {
    44. PrintWriter pw = response.getWriter();
    45. pw.println("<!DOCTYPE html>");
    46. pw.println("<html lang=\"en\">");
    47. pw.println("<head>");
    48. pw.println("<meta charset=\"UTF-8\">");
    49. pw.println("<title>用户列表</title>");
    50. pw.println("</head>");
    51. pw.println("<body>");
    52. pw.println("<center>");
    53. pw.println("<h1>用户列表</h1>");
    54. pw.println("<table border=\"1\">");
    55. pw.println("<tr>");
    56. pw.println("<td>用户名</td>");
    57. pw.println("<td>密码</td>");
    58. pw.println("<td>昵称</td>");
    59. pw.println("<td>年龄</td>");
    60. pw.println("</tr>");
    61. for (User user : userList) {
    62. pw.println("<tr>");
    63. pw.println("<td>" + user.getUsername() + "</td>");
    64. pw.println("<td>" + user.getPassword() + "</td>");
    65. pw.println("<td>" + user.getNickname() + "</td>");
    66. pw.println("<td>" + user.getAge() + "</td>");
    67. pw.println("</tr>");
    68. }
    69. pw.println("</table>");
    70. pw.println("</center>");
    71. pw.println("</body>");
    72. pw.println("</html>");
    73. } catch (IOException e) {
    74. e.printStackTrace();
    75. }
    76. }
    77. @RequestMapping("/myweb/login")
    78. public void login(String username,String password, HttpServletResponse response) {
    79. if (username == null || password == null|| username.isEmpty()||password.isEmpty()) {
    80. try {
    81. response.sendRedirect("/myweb/login_info_error.html");
    82. } catch (IOException e) {
    83. e.printStackTrace();
    84. }
    85. return;
    86. }
    87. //2
    88. File userFile = new File(userDir, username + ".obj");
    89. if (userFile.exists()) {//用户名输入正确
    90. try (
    91. FileInputStream fis = new FileInputStream(userFile);
    92. ObjectInputStream ois = new ObjectInputStream(fis);
    93. ) {
    94. //读取该注册用户信息
    95. User user = (User) ois.readObject();
    96. if (user.getPassword().equals(password)) {//密码正确
    97. //登录成功
    98. response.sendRedirect("/myweb/login_success.html");
    99. return;
    100. }
    101. } catch (IOException | ClassNotFoundException e) {
    102. e.printStackTrace();
    103. }
    104. }
    105. //如果程序走到这里,情况1:用户名没有输入正确,文件不存在
    106. // 情况2:用户名对了,但是密码不对
    107. try {
    108. response.sendRedirect("/myweb/login_fail.html");
    109. } catch (IOException e) {
    110. e.printStackTrace();
    111. }
    112. }
    113. /**
    114. * 传参方式灵活
    115. * 传参方式1:可以指定HttpServletRequest和HttpServletResponse作为参数
    116. *
    117. * 传参方式2:还可以直接将表单传递过来的参数作为作为方法参数定义出来,需要注意的点:
    118. * 方法中参数名必须和页面上表单中输入框的名字一致(浏览器传递过来的参数名)
    119. *
    120. * 传参方式3:直接将一个对象作为参数,需要注意,该对象中属性名应当和表单提交的数据时
    121. * 对应输入框的名字要一致!
    122. * Sprint MVC框架会使用该类的无参构造器实例化,并利用属性对应的set方法
    123. * 将表单中对应的数据赋值给该属性。之后就可以将该对象传递进方法了。
    124. *
    125. */
    126. @RequestMapping("/myweb/reg")
    127. //传参方式3
    128. public void reg(User user,HttpServletResponse response){
    129. if(user.getUsername()==null||user.getPassword()==null||
    130. user.getNickname()==null||user.getUsername().isEmpty()||
    131. user.getPassword().isEmpty()||user.getNickname().isEmpty()){
    132. try {
    133. response.sendRedirect("/myweb/reg_info_error.html");
    134. } catch (IOException e) {
    135. e.printStackTrace();
    136. }
    137. return;
    138. }
    139. File userFile = new File(userDir,user.getUsername()+".obj");
    140. if(userFile.exists()){//文件存在则说明是重复用户
    141. try {
    142. response.sendRedirect("/myweb/have_user.html");
    143. } catch (IOException e) {
    144. e.printStackTrace();
    145. }
    146. return;
    147. }
    148. try (
    149. FileOutputStream fos = new FileOutputStream(userFile);
    150. ObjectOutputStream oos = new ObjectOutputStream(fos);
    151. ){
    152. oos.writeObject(user);
    153. response.sendRedirect("/myweb/reg_success.html");
    154. } catch (IOException e) {
    155. e.printStackTrace();
    156. }
    157. }
    158. //传参方式2
    159. // public void reg(String username,String password,String nickname,int age,HttpServletResponse response){
    160. // System.out.println(username+","+password+","+nickname+","+age);
    161. //
    162. // }
    163. //传参方式1
    164. // public void reg(HttpServletRequest request, HttpServletResponse response){
    165. // String username = request.getParameter("username");
    166. // String password = request.getParameter("password");
    167. // String nickname = request.getParameter("nickname");
    168. // String ageStr = request.getParameter("age");
    169. // System.out.println(username+","+password+","+nickname+","+ageStr);
    170. //
    171. // //后期可以使用spring验证框架来完成
    172. // if(username==null||password==null||nickname==null||ageStr==null||
    173. // !ageStr.matches("[0-9]+")){
    174. // try {
    175. // response.sendRedirect("/myweb/reg_info_error.html");
    176. // } catch (IOException e) {
    177. // e.printStackTrace();
    178. // }
    179. // return;
    180. // }
    181. // int age = Integer.parseInt(ageStr);
    182. // User user = new User(username,password,nickname,age);
    183. // }
    184. }

    2.2.2User(实体层)

    1. package com.myboot.myfirstspringboot.entity;//实体
    2. import java.io.Serializable;
    3. /**
    4. * User的每一个实例用于表示一个注册用户信息
    5. */
    6. public class User implements Serializable {
    7. public static final long serialVersionUID = 1L;
    8. private String username;
    9. private String password;
    10. private String nickname;
    11. private int age;
    12. public User(){}
    13. public User(String username, String password, String nickname, int age) {
    14. this.username = username;
    15. this.password = password;
    16. this.nickname = nickname;
    17. this.age = age;
    18. }
    19. public String getUsername() {
    20. return username;
    21. }
    22. public void setUsername(String username) {
    23. this.username = username;
    24. }
    25. public String getPassword() {
    26. return password;
    27. }
    28. public void setPassword(String password) {
    29. this.password = password;
    30. }
    31. public String getNickname() {
    32. return nickname;
    33. }
    34. public void setNickname(String nickname) {
    35. this.nickname = nickname;
    36. }
    37. public int getAge() {
    38. return age;
    39. }
    40. public void setAge(int age) {
    41. this.age = age;
    42. }
    43. @Override
    44. public String toString() {
    45. return "User{" +
    46. "username='" + username + '\'' +
    47. ", password='" + password + '\'' +
    48. ", nickname='" + nickname + '\'' +
    49. ", age=" + age +
    50. '}';
    51. }
    52. }

    2.2.3MyFirstSpringBootApplication(启动类)

    1. package com.myboot.myfirstspringboot;
    2. import org.springframework.boot.SpringApplication;
    3. import org.springframework.boot.autoconfigure.SpringBootApplication;
    4. @SpringBootApplication
    5. public class MyFirstSpringBootApplication {
    6. public static void main(String[] args) {
    7. SpringApplication.run(MyFirstSpringBootApplication.class, args);
    8. }
    9. }

    2.3HTML代码

    2.3.1have_user.html

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>失败</title>
    6. </head>
    7. <body>
    8. <center>
    9. <h1>该用户已存在,请<a href="/myweb/reg.html">重新注册</a></h1>
    10. </center>
    11. </body>
    12. </html>

    2.3.2index.html

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>我的首页</title>
    6. </head>
    7. <body>
    8. <!--
    9. <h1>-<h6>:标题,分为1-6级标题。标题独占一行
    10. <center>:居中,该标签在HTML5中已经不再建议使用了。没学习样式前临时使用
    11. <input>:输入组件。它是一套组件,用来在页面上获取用户输入的。
    12. 属性type决定着该组件的样式。
    13. 常见的值有:
    14. text:文本框
    15. button:按钮
    16. checkbox:多选框
    17. radio:单选框
    18. submit:提交按钮
    19. password:密码框
    20. <a>:超链接,标签中间的文本是超链接对应的文字,属性href用于指定跳转的路径
    21. <br>:换行
    22. <table>标签:表格。属性border用于指定边框。
    23. <table>标签中包含<tr>标签用于表示行
    24. <tr>标签中包含<td>标签用于表示列
    25. <td>标签中常见属性:
    26. align:对其方式。left左对齐,right右对齐,center剧中对其
    27. colspan:跨列合并列,合并是从左向右合并列
    28. rowspan:跨行合并列,合并是从上向下合并列
    29. <img>:图片标签,src属性用于指定图片的路径
    30. 在页面上我们经常会使用路径去定位页面上要使用的额外资源,比如CSS文件,JS文件
    31. 图片文件等。
    32. 例如图片:
    33. <img src=""> 这里的src就是用于指定图片的路径的
    34. 路径分两种:相对路径和绝对路径
    35. 相对路径常用的:"./",即:当前目录
    36. 在浏览器中和我们在java源代码中"./"位置不是相同的!!!!!!
    37. 原因是页面是被浏览器理解的。
    38. 在页面上"./"的位置浏览器理解的是:URL地址当中抽象路径里的最后一个"/"的位置
    39. 例如:
    40. 请求inde.html时,我们在地址栏上输入的路径为:
    41. http://localhost:8088/myweb/index.html
    42. 在这个页面上我们使用了<img src="logo.png"> 注:不写"./"默认就是从"./"开始
    43. 此时浏览器判定该图片的实际位置是哪里,就是根据请求当前页面的URL地址决定:
    44. 当前URL地址中抽象路径部分为:/myweb/index.html
    45. 因此"./"理解的就是这里最后一个"/"的位置为:/myweb/
    46. ^
    47. ./的位置
    48. 所以确定了图片的抽象路径部分为:/myweb/logo.png
    49. 因此浏览器实际请求图片的路径为:
    50. http://localhost:8088/myweb/logo.png
    51. 绝对路径:"/",即:根
    52. 在页面上"/"的位置浏览器理解的是:URL地址当中抽象路径里的第一个"/"的位置
    53. 同样,如果在当前页面上<img src="/myweb/logo.png">
    54. 此时浏览器理解的"/myweb/logo.png"发先路径从"/"开始,即:从根开始。
    55. 请求当前页面路径:http://localhost:8088/myweb/index.html
    56. ^
    57. 就是抽象路径的根
    58. 因此该图片实际请求位置:
    59. http://localhost:8088/myweb/logo.png
    60. 相对路径存在定位不准确情况,常见于服务端转发404时
    61. 例如:请求一个不存在的页面
    62. http://localhost:8088/myweb/123.html
    63. 服务端发现该页面不存在后,就响应了root目录下的404.html
    64. 而404页面上我们指定图片如果为:<img src="404.png">
    65. 那么浏览器在得到404页面时,理解的404图片实际位置是哪里?
    66. 由于浏览器是请求 http://localhost:8088/myweb/123.html看到的404页面
    67. 因此浏览器会参考该地址中抽象路径部分:/myweb/123.html来分析404图片位置
    68. 由于"./404.png"中的"./"是当前目录,因此浏览器认为该图片的抽象路径应当为:
    69. "/myweb/404.png"于是请求了:http://localhost:8088/myweb/404.png
    70. 为了定位准确,我们选取绝对路径中的根"/"
    71. <img src="/root/404.png">
    72. -->
    73. <center>
    74. <!--<h1>百度</h1>-->
    75. <img src="/myweb/logo.png"><br>
    76. <input type="text" size="32">
    77. <input type="button" value="百度一下" onclick="alert('点你妹啊!')">
    78. <br>
    79. <a href="/myweb/reg.html">注册</a>
    80. <a href="/myweb/login.html">登录</a>
    81. <a href="/myweb/showAllUser">用户列表</a>
    82. <br>
    83. <a href="/myweb/writeArticle.html">发表文章</a>
    84. <br>
    85. <a href="/myweb/createQR.html">二维码生成器</a>
    86. <br>
    87. <a href="http://www.taobao.com">淘宝</a>
    88. <br>
    89. <table border="1">
    90. <tr>
    91. <td>第一列</td>
    92. <td>第二列</td>
    93. <td colspan="2" align="center">第三列</td>
    94. </tr>
    95. <tr>
    96. <td rowspan="2">第一列</td>
    97. <td>第二列</td>
    98. <td>第三列</td>
    99. <td>第四列</td>
    100. </tr>
    101. <tr>
    102. <td>第二列</td>
    103. <td>第三列</td>
    104. <td>第四列</td>
    105. </tr>
    106. </table>
    107. </center>
    108. </body>
    109. </html>

    2.3.3reg.html

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>用户注册</title>
    6. </head>
    7. <body>
    8. <center>
    9. <h1>用户注册</h1>
    10. <!--
    11. 表单组件<form>
    12. 表单用于将用于在页面上输入的信息提交给服务端使用的组件。
    13. 表单上有两个重要的属性:
    14. action:用于指定表单提交的路径
    15. method:用于指定表单提交的方式,该方式有两个可选值
    16. GET:地址栏形式提交,表单数据会被拼接到URL的抽象路径中
    17. POST:打包提交,表单数据会被包含在请求的消息正文中。
    18. 当表单数据含有用户隐私信息或附件时则需要使用POST形式提交表单。
    19. method属性不指定时,默认为GET形式提交表单。
    20. 注意:所有输入组件只有被包含在form表单中并且必须使用name属性为该组件取名字才会被提交!!
    21. 输入组件取的名字可以任意定义,但是不能有中文(英文数字)。
    22. http://localhost:8088/myweb/reg?username=fancq&password=123456&nickname=chuanqi&age=22
    23. 表单提交后的URL中抽象路径:
    24. /myweb/reg?username=fancq&password=123456&nickname=chuanqi&age=22
    25. URL地址中抽象路径部分可以使用"?"分隔为两块,分别是请求部分和参数部分
    26. 请求部分由表单action决定.参数部分由表单中输入框决定
    27. 格式:
    28. 请求部分?输入框1名字=输入框1信息&输入框2名字=输入框2信息&.....
    29. -->
    30. <form action="/myweb/reg" method="get">
    31. <table border="1">
    32. <tr>
    33. <td>用户名</td>
    34. <td><input name="username" type="text"></td>
    35. </tr>
    36. <tr>
    37. <td>密码</td>
    38. <td><input name="password" type="password"></td>
    39. </tr>
    40. <tr>
    41. <td>昵称</td>
    42. <td><input name="nickname" type="text"></td>
    43. </tr>
    44. <tr>
    45. <td>年龄</td>
    46. <td><input name="age" type="text"></td>
    47. </tr>
    48. <tr>
    49. <td colspan="2" align="center">
    50. <input type="submit" value="注册">
    51. </td>
    52. </tr>
    53. </table>
    54. </form>
    55. </center>
    56. </body>
    57. </html>

    2.3.4reg_info_error.html

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>失败</title>
    6. </head>
    7. <body>
    8. <center>
    9. <h1>注册信息输入有误,请<a href="/myweb/reg.html">重新注册</a></h1>
    10. </center>
    11. </body>
    12. </html>

    2.3.5reg_success.html

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>成功</title>
    6. </head>
    7. <body>
    8. <center>
    9. <h1>恭喜您,注册成功了!</h1>
    10. </center>
    11. </body>
    12. </html>

  • 相关阅读:
    深入Spring 5 事务原理与源码分析【精品分享】
    初识Java 16-1 字符串
    echarts 各个配置项详细说明总结
    Pulsar【部署 02】Pulsar可视化工具Manager安装使用
    【高并发】深度解析ScheduledThreadPoolExecutor类的源代码
    Android Automotive编译
    ElasticSearch搜索引擎使用指南
    让历史文化“活”起来,北京河图“万象中轴”助力打造北京城市金名片
    MATLAB 的trainNetwork变化
    c++基础(九)——静态成员
  • 原文地址:https://blog.csdn.net/TheNewSystrm/article/details/125489320