文章目录
一、JavaWeb
1、什么是Javaweb
就是使用 java语言写Web网站
静态网站和动态网站的区别
- 静态网站:HTML、CSS、JS
- 动态网站:Servlet/JSP,等和数据库连接
项目中导入依赖的方式
- 手动导入需要的jar包,然后将jar包添加到项目的依赖中
- 使用Maven,在https://mvnrepository.com/ 上查找相关的依赖,然后配置到在pom.xml中,项目会自动导入所需要的jar包
HTTP:请求和响应
-
请求
客户端通过请求获得服务器上的一定资源
任何一个请求都会在服务器上找到对应的资源
-
响应
服务器针对客户端的请求,给客户端返回一定的资源
常见响应状态码
200:正常响应
404:没有找到资源,资源路径报错
500:后台代码有问题
3XX:转发或者重定向
502:网关问题
Web项目的结构
- WEB-INF
- web.xml
- lib依赖
- class,Java编译过后的class文件
- index.jsp
- ...
2、如何创建一个Web项目
1、创建一个Maven项目
定位一个Maven项目的三要素:GAV(分组、项目名、版本)
Maven项目中的文件夹含义:
- pom.xml:依赖管理
- java:写Java代码的
- resource:存放资源的
- test:测试
如何将普通的Maven项目变成Web项目
在项目名称上右键,选择Add Framework Support,然后选择web框架,然后项目中会多一个Web目录,这样子项目就成了Web项目
在开始页面使用Maven模板创建的项目和创建Maven项目再导入Web支持的项目的区别
- 使用Maven模板创建的项目默认导入junit包
- 使用Maven模板创建的不是标准的Maven项目,没有Java包、resource包,需要手动去导入
- 使用Maven模板创建的项目的项目wed.xml版本太旧了,需要将版本换成新的
3、Servlet
1、导入依赖的方式
-
将lib包导入,然后手动导入
-
使用Maven仓库,在pom.xml中导入依赖。scope是依赖的使用范围
2、IDEA中创建Servlet的方式
-
创建Java类,继承HttpServlet类
-
右键选择直接创建Servlet
两种方法都间接的实现了Servlet接口,本质上是一样的
3、运行Servlet
在web.xml配置文档中注册Servlet标签和Servlet-mapping标签,Tomcat服务器会根据配置的路径找到对应的Servlet来处理请求
4、使用Servlet在浏览器输出HTML网页
package org.westos.servlet;
import javax.servlet.http.HttpServlet;
import java.io.IOException;
import java.io.PrintWriter;
public class HelloServlet extends HttpServlet {
protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
PrintWriter out = response.getWriter();
out.print("<html>");
out.print(" <head>");
out.print(" <title>HelloServlet</title>");
out.print(" </head>");
out.print("<body>");
out.print(" <h1>Hello,Servlet</h1>");
out.print("</body>");
out.print("</html>");
}
protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
doPost(request, response);
}
}
4、request和response对象
request:通过请求对象request,可以获得请求的一些信息
response:通过响应对象response,可以给前端响应一些信息
Servlet中的信息的传递都是使用流来实现的,流使用完毕以后要关闭资源
5、cookie和session(含例题)
从请求中获得cookie和session对象
cookie:客户端拿着
session:服务器拿着,服务器资源比较宝贵
1、获得session和cookie
package org.westos.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
public class HelloServlet2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//得到session
HttpSession session = request.getSession();
//查看sessionId
System.out.println(session.getId());
//获得请求中的所有的cookie
Cookie[] cookies = request.getCookies();
//遍历打印
for (Cookie cookie : cookies) {
System.out.println(cookie.getName() + ":" +
cookie.getValue());
}
//给客户端响应一个cookie
Cookie cookie = new Cookie("key1", "value1");
response.addCookie(cookie);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
2、使用cookie判断用户第几次来
package org.westos.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
@WebServlet(name = "CookieDemo")
public class CookieDemo extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//乱码解决
response.setContentType("text/html;charset=utf-8");
//获得响应流
PrintWriter out = response.getWriter();
//获得cookies
Cookie[] cookies = request.getCookies();
//判断
if (cookies != null) {
out.write("上次访问的时间");
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
if (cookie.getName().equals("lastTime")) {
long l = Long.parseLong(cookie.getValue());
Date date = new Date(l);
out.write(date.toLocaleString());
}
}
} else {
out.write("first coming");
}
//设置cookie
Cookie lastTime = new Cookie("lastTime", System.currentTimeMillis() + "");
//设置Cookie的过期时间
lastTime.setMaxAge(24 * 60 * 60);
//添加Cookie
response.addCookie(lastTime);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
6、JSP
JSP:Java Servlet Page
-
Servlet本质
本质上其实就是一个Java类,间接实现了Servlet接口。其实就是Servlet,只是在Servlet中一些代码我们要自己写,而在JSP中已经封装好了,比较方便。
在电脑C盘用户目录下,有一个IntelliJIdea2018.2\system\tomcat目录,点开目录下的项目,便可以看到IDEA里面的***.jsp文件都变成了***_jsp.java文件,使用记事本打开看到里面的源码就是Java类
JSP中默认调用了_jspService()方法,jsp文件中的代码会被转换为out.write("");代码进行执行
-
jsp为什么过时
jsp是视图层的,视图层用来控制视图、编写页面,进行HTML/CSS/取值之类的操作,但是JSP本是又是Servlet,能够进行控制层的操作,在JSP中使用Servlet的操作不利于网页结构的分层,会增加程序的耦合度,不利于解耦
所有的业务逻辑都应该使用Servlet进行编写,所以JSP很少使用了,为了程序的解耦,MVC分层思想
7、JSP九大内置对象
是jsp内部写好的,可以直接拿来使用
-
pageContext
页面上下文,只是页面的范围。可以从中获取session信息,输出对象out,application等
pageContext.forward()
pageContext.getRequest()
pageContext.getResponse()
-
session
一次会话
-
application
整个Web应用中
-
config
配置
-
out
写出内容
-
page
当前页面
-
Exception
异常
-
request(继承自HttpServlet)
-
response(继承自HttpServlet)
8、JSP语法
-
注释
jsp注释
JSP注释在加载为类的时候不会被加载进去,所以不会在前端网页看到,只会给后台程序员看到 <%--jsp注释--%>
HTML注释
前端页面可以看到 <-- 注释 -->
-
JSP脚本表达式
会直接在网页上显示表达式或变量的值
会直接在页面上输出脚本或表达式的值 <%= 表达式或值 %>
-
EL表达式
和JSP脚本表达式的作用一样,不过一般使用EL表达式,更简单
${变量或表达式}
-
jsp脚本片段
在里面写Java代码,定义的变量是局部变量
<% //任意Java代码,定义的变量是局部变量,在_jspService()方法中 int a = 0; %>
-
JSP代码拼接
可以循环显示HTML代码等
<% for(int j=0;j<10.j++){ %> 要执行的html代码等 <% } %>
-
JSP脚本片段
在里面写Java代码,定义的变量是全局变量
<%! //任意Java代码,定义的变量是全局变量,在类中 int a = 0; %>
9、EL表达式
-
格式
${表达式或变量}
将变量或表达式的值直接显示在网页上,可以取出后台的值
EL表达式的取值是有范围的
-
EL表达式的范围
pageContext:在当前页面中,出了页面就不能用了
request(常用):一次请求中的
session(常用):一次会话中的,一般放用户信息
application:在整个Web服务器中
作用域:就近原则,假设有多个变量在不同的作用域中重复,采用就近原则
10、Lombok配置及使用
-
在IDEA中安装Lombok插件
在setting中的plugins中搜索Lombok,安装后重启IDEA
-
配置Lombok依赖
<!-- lombok依赖 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> </dependency>
-
在实体类上加
@Data
注解 -
这样子就不用每次手动去重写类的get/set/toString/…等方法,会自动帮我们写上
-
测试
package org.westos.pojo; import lombok.Data; //注解,加上后就不用重写那么多方法了 @Data public class Users { private String name; private String password; private int age; //此处并没有加公开的get/set方法,但是仍然可以被使用 public static void main(String[] args) { Users user = new Users(); user.setPassword("123456"); user.setName("张三"); user.setAge(23); System.out.println(user); } }
11、模拟登录页面,EL表达式取值
-
模拟前端页面传来的参数
http://localhost:8080/javaweb/login?username=admin&password=12345
-
编写Servlet
package org.westos.servlet; import org.westos.pojo.Users; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //完整的前端的请求URL //http://localhost:8080/javaweb/login?username=zhangsan&password=123456 //1.先得到Session HttpSession session = request.getSession(); //2.得到前端传递的参数 String username = request.getParameter("username"); String password = request.getParameter("password"); //3.业务代码,判断用户是否登录成功,这里将数据写死,没有使用数据库,真实场景应从数据库中查询 if (username.equals("admin") && password.equals("123456")) { //创建初始化对象 Users user = new Users(); user.setName(username); user.setPassword(password); user.setAge(23); //登陆成功,将对象放在session中 session.setAttribute("loginUser", user); //登陆成功就将错误信息移除 session.removeAttribute("error"); } else { //登陆失败 //显示错误信息 session.setAttribute("error","用户名或密码错误"); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //调用doPost()方法 doPost(request, response); } }
-
在web.xml文档中配置
<servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>org.westos.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping>
-
创建前端jsp页面,显示登录信息
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>用户信息</title> </head> <body> <%--从session中得到用户的登录信息--%> 用户名: ${loginUser.getName()} 年龄: ${loginUser.getAge()} <%--报错信息,如果登录成功,就会移除--%> ${error} </body> </html>