JavaWeb基础1-1
一、Maven
常用的Maven仓库
用pom.xml文件表示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
| <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId> <artifactId>New_Maven_1</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging>
<properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties>
<build> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <port>8080</port> <path>/</path> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>
<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.11.0</version> </dependency>
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency>
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency>
<dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> <scope>provided</scope> </dependency>
<dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
<dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.83</version> </dependency>
</dependencies>
</project>
|
二、MyBatis
优秀的持久层框架,简化JDBC的开发
JavaEE的三层:表现层、业务层、持久层
可以理解为Java程序与数据库的连接和交换方式
三、Mapper
首先注意映射关系,如图:
1、写在xml文件中的方法
BrandMapper.xml
1 2 3 4 5 6 7 8 9 10
| <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.study.mapper.BrandMapper"> <resultMap id="brandResultMap" type="brand"> <result column="brand_name" property="brandName"></result> <result column="company_name" property="companyName"></result> </resultMap> </mapper>
|
BrandMapper.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| package com.study.mapper;
import org.apache.ibatis.annotations.ResultMap; import org.apache.ibatis.annotations.Select; import com.study.pojo.Brand; import java.util.List;
public interface BrandMapper {
@Select("select * from tb_brand") @ResultMap("brandResultMap") List<Brand> selectAll(); }
|
2、全部写在注释中的方法
UserMapper.xml
1 2 3 4 5 6 7
| <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="User.mapper.UserMapper">
</mapper>
|
UserMapper.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| package User.mapper; import User.pojo.User; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select;
public interface UserMapper {
@Select("select * from tb_user where username = #{username} and password = #{password}") User select(@Param("username") String username, @Param("password") String password);
@Select("select * from tb_user where username = #{username}") User selectByUsername(@Param("username") String username);
@Insert("insert into tb_user values(null,#{username},#{password})") void add(User user);
}
|
四、Tomcat
一个网络服务框架
可以本地配置,也可以Maven导入一个插件
同时注意,Tomcat9及之前的版本默认的编码格式不是UTF-8,是ISO-8859-1,Tomcat10是UTF-8,可能会出现中文乱码的问题
GET的解决方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| @WebServlet("/resp3") public class ResponseDemo3 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username = "张三";
String s = new String(username.getBytes("ISO-8859-1"),"utf-8");
} }
|
POST的解决方式:
1 2 3 4 5 6 7 8 9
| @WebServlet("/resp3") public class ResponseDemo3 extends HttpServlet {
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=utf-8"); } }
|
五、Servlet
1、Request和Response
使用Request对象来【获取请求】数据
使用Response对象来【设置相应】数据
一般格式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| @WebServlet("/resp2")
public class ResponseDemo2 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=utf-8"); PrintWriter writer = resp.getWriter(); writer.write("resp2"); }
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }
|
2、SqlSessionFactory
一般要抽取一个SqlSessionFactory工具类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public class SqlSessionFactoryUtils { private static SqlSessionFactory sqlSessionFactory; static { try { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } public static SqlSessionFactory getSqlSessionFactory(){ return sqlSessionFactory; } }
|
相关的调用和替代:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| @WebServlet("/request-demo/registerServlet") public class RegisterServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username = req.getParameter("username"); String password = req.getParameter("password");
User user = new User(); user.setUsername(username); user.setPassword(password);
SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();
SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User u = userMapper.selectByUsername(username);
if (u == null) { userMapper.add(user); sqlSession.commit(); sqlSession.close(); resp.setContentType("text/html;charset=utf-8"); resp.getWriter().write("注册成功"); } else { resp.setContentType("text/html;charset=utf-8"); resp.getWriter().write("用户已存在"); }
} }
|
六、JSP
先导入最先的需要的Maven库和其依赖
1、Java Server Pages/Java服务端页面
一种动态的网页技术,可以定义HTML、JS、CSS等静态内容,还可以定义Java代码的动态内容
1 2 3 4 5 6 7 8 9 10 11 12
| <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <% System.out.println("hello"); %> </body> </html>
|
2、EL表达式和JSTL
EL表达式特点(四大域对象)
ServletDemo1设定:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| @WebServlet("/JSTL") public class ServletDemo1 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setAttribute("username", "NewUserRequest"); req.setAttribute("status",1);
req.getRequestDispatcher("/el-demo.jsp-demo.jsp").forward(req,resp); List<String> list = new ArrayList<>(); list.add("aaa"); list.add("bbb"); list.add("ccc"); }
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }
|
jsp引用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <%--if判断--%> <c:if test="${status} == 1"> <h1>Test Successful</h1> </c:if> <c:if test="${status} == 0"> <h1>Test fail</h1> </c:if> <%--for遍历--%> <c:forEach items="${list}" var="item"> <h1>${item}</h1> </c:forEach> </body> </html>
|
3、MVC模式和三层架构
七、Cookie和Session
1、Cookie
Cookie的概念:
Cookie: 客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问。
Cookie的使用:
储存:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| @WebServlet("/aServlet") public class AServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Cookie cookie = new Cookie("username", "NewUser"); cookie.setMaxAge(60*60*24*1); resp.addCookie(cookie); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }
|
读取:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| @WebServlet("/bServlet") public class BServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Cookie[] cookies = req.getCookies(); for (Cookie cookie : cookies) { String name = cookie.getName(); if("username".equals(name)){ String value = cookie.getValue(); System.out.println(name + ":" + value); } break; } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }
|
Cookie不能直接储存中文,要进行URL编码:
储存:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| @WebServlet("/aServlet") public class AServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String value = "张三"; value = URLEncoder.encode(value, "UTF-8"); Cookie cookie = new Cookie("username", value); cookie.setMaxAge(60*60*24*1); resp.addCookie(cookie); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }
|
读取:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| @WebServlet("/bServlet") public class BServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Cookie[] cookies = req.getCookies(); for (Cookie cookie : cookies) { String name = cookie.getName(); if("username".equals(name)){ String value = cookie.getValue(); value = URLDecoder.decode(value, "utf-8"); System.out.println(name + ":" + value); } break; } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }
|
2、Session
服务端会话跟踪技术,将数据保存到服务端
Session是基于Cookie实现
基本用法:
储存:
1 2 3 4 5 6 7 8 9 10 11 12 13
| @WebServlet(name = "SessionDemo1", value = "/SessionDemo1") public class SessionDemo1 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); session.setAttribute("username", "NewUserSession"); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
|
读取:
1 2 3 4 5 6 7 8 9
| @WebServlet(name = "SessionDemo2", value = "/SessionDemo2") public class SessionDemo2 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); Object username = session.getAttribute("username"); System.out.println(username); } }
|