1. 课程前言
搭建环境:JDK–(检查环境:java、javac、javac -version)
开发工具:eclipse–
更改编码:全部:【Window–Perferences–General–WorkSpcae】
JSP文件:【Window–Perferences–Java–Jsp File】
jre设置:【Window–Perferences–Java–Installed JREs】
Tomcat:Server窗体
双击打开:Servers Location:选择Use Tomcat installation,将Deploy path更改为webapps。
【其他问题参考Tomcat入坑指南】
布局混乱,恢复原始布局设置:【Window–perspacetive–reset】
2. 创建第一个动态项目【同五、4.1】
新建Dynamic web project,在项目下新建main.jsp
<%@page import="java.text.SimpleDateFormat"%>
<%@page import="java.util.Date"%>
<%@page import="java.net.Inet4Address"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
获取远程IP地址:<%=request.getRemoteAddr()%><br>
获取自身IP地址:<%=Inet4Address.getLocalHost().getHostAddress() %><br>
获取当前时间:<%=new Date()%>
</body>
</html>
创建项目过程中可能会出现的问题:
jsp的第一行报红XXX
项目上有红色感叹号
问题出现原因:环境出现问题【JDK版本、JRE缺失、第三方jar包缺失】
解决:右击项目–Build Path–Configure Build Path–Libraries–此处出现报错的包,一般项目就会报红XXX。
删掉报错的包,重新引入即可解决。
备注:添加的工具是已经关联的–可以直接添加【Add Library–EAR Library/JRE System Library/Server Runtime/Web App Library】。
补充知识点:
序号 方法 描述 1 GET 发送请求来获得服务器上的资源,请求体中不会包含请求数据,请求数据放在协议头中。另外get支持快取、缓存、可保留书签等。幂等 2 POST 和get一样很常见,向服务器提交资源让服务器处理,比如提交表单、上传文件等,可能导致建立新的资源或者对原有资源的修改。提交的资源放在请求体中。不支持快取。非幂等 3 HEAD 本质和get一样,但是响应中没有呈现数据,而是http的头信息,主要用来检查资源或超链接的有效性或是否可以可达、检查网页是否被串改或更新,获取头信息等,特别适用在有限的速度和带宽下。 4 PUT 和post类似,html表单不支持,发送资源与服务器,并存储在服务器指定位置,要求客户端事先知道该位置;比如post是在一个集合上(/province),而put是具体某一个资源上(/province/123)。所以put是安全的,无论请求多少次,都是在123上更改,而post可能请求几次创建了几次资源。幂等 5 DELETE 请求服务器删除某资源。和put都具有破坏性,可能被防火墙拦截。如果是https协议,则无需担心。幂等 6 CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。就是把服务器作为跳板,去访问其他网页然后把数据返回回来,连接成功后,就可以正常的get、post了。 7 OPTIONS 获取http服务器支持的http请求方法,允许客户端查看服务器的性能,比如ajax跨域时的预检等。 8 TRACE 回显服务器收到的请求,主要用于测试或诊断。一般禁用,防止被恶意攻击或盗取信息。 以上方法用法都是一致的!那为什么还有这么多方法?
通过名字来区分功能业务。后来,将不同的方进行个性化处理;再后来,post get。
GET 和 POST 比较:
GET | POST | |
---|---|---|
点击返回/刷新按钮 | 没有影响 | 数据会重新提交 |
缓存/添加书签 | 可以 | 不可以 |
历史记录 | 有 | 没有 |
编码类型 | application/x-www-form-urlencoded | application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码 |
是否幂等 | 幂等 | 非幂等 |
长度限制 | http协议没有限制,但是实际浏览器或服务器有(最大2048) | 理论上没有,可能会收到服务器配置或内存限制 |
数据类型限制 | 只能ASCII,非ascii都要编码传输 | 没有限制,允许二进制数据 |
安全性 | 数据全部展示在url中,不安全 | 相比get,通过request body传递数据,比较安全 |
可见效 | 可见 | 不可见 |
3. Java的web开发–JavaEE
3.1 JavaEE技术概述
是一门综合性技术,包含13个组件:jsp、servlet、EJB等等。
主要学习两个技术【组件】:Servlet和Jsp
3.2 学习javaEE组件之Servlet
Servlet入门:概念、使用、作用、继承关系、生命周期。
Servlet高级:四大作用域、监听器和过滤器。
3.2.1 servlet的概念
是javaEE的组件 必须在容器中运行【服务器,此时使用的服务器是Tomcat】。
Servlet本质上就是一个java类,必须遵守规范,继承HTTPServlet。【HTTPServlet中定义了一些规范,适应http请求协议】
3.2.2 servlet的使用
创建第一个Servlet。
HttpServlet:
Provides an abstract class to be subclassed to createan HTTP servlet suitable for a Web site. A subclass of HttpServlet must override at leastone method, usually one of these: //提供了一个抽象类来创建适合网站的HTTP servlet。HttpServlet的一个子类必须至少覆盖一个方法,通常其中之一: •doGet, if the servlet supports HTTP GET requests //doGet,如果servlet支持HTTP-GET请求 •doPost, for HTTP POST requests //doPost,用于HTTP POST请求 •doPut, for HTTP PUT requests //doPut,用于HTTP PUT请求 •doDelete, for HTTP DELETE requests //doDelete,用于HTTP DELETE 请求 •init and destroy,to manage resources that are held for the life of the servlet //启动和销毁,以管理servlet生命周期中保存的资源 •getServletInfo, which the servlet uses toprovide information about itself //getServletInfo,servlet使用它来提供有关自身的信息
重写HttpServlet中的方法。
例(FirstServlet.class): |
---|
package pers.wcs.firstwork.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
* @author WCS
* @version V.1.0.1
* @date 2021-12-09 02:28
* 需求:自定义一个Servlet
* 思路分析:
* 问题汇总:
*/
public class FirstServlet extends HttpServlet {
/**
*
* 需求:
* 问题汇总:
*
* @author WCS
* @version V.1.0.1
* @date 2021-12-09 02:53
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 创建内容
resp.setContentType("text/html;charset=UTF-8");
// 获取响应流
PrintWriter out = resp.getWriter();
// 编写业务代码
out.println("<html>");
out.println("<head><title>第一个servlet返回数据</title></head>");
out.println("<body>");
out.println(new Date());
out.println("今天天气不错!");
out.println("</body>");
out.println("</html>");
}
}
3.2.3 web.xml
- 将创建好的servlet交给服务管理器【容器】
- 在web.xml文件中进行配置【web.xml是服务开放处理数据的接口】
web.xml的简介:
是一个xml文件
welcome-file—访问项目默认加载的页面-主页
<!-- 配置servlet 将我们的servlet类交给服务器管理 --> <servlet> <servlet-name>起一个别名【便于映射】</servlet-name> <servlet-class>我们的servlet类的全类名</servlet-class> </servlet> <servlet-mapping> <servlet-name>和上面的别名一样</servlet-name> <url-pattern>/请求地址</url-pattern> </servlet-mapping>
3.2.4 servlet的执行流程分析
①浏览器输入网址发送请求:
例如:http://localhost:8080/MyFirstWork/mservlet
②服务器接收请求拆解地址:
- http–协议
- localhost:8080–访问Tomcat服务器
- /MyFirstWork–访问对应的项目
- /mservlet–表示访问的资源地址
- webcontnt/webapp下找
- web.xml找url
如果在web.xml中找到了url–获取对应名字,通过名字找servlet,加载servlet类–执行返回结果。
③快速创建servlet【–new–servlet】
3.2.5 servlet的作用
初心:最开始servlet是用于编写动态网页【使用响应中的printWriter流进行响应给客户端浏览器】;
中间:发现问题,如果使用servlet去做动态页面非常复杂;
后来:就创建了jsp组件,将动态页面的功能分割出去,让jsp专门做,servlet就不做动态页面了;
当前:servlet的功能转变,它的作用变成:中间商,主要功能:接收请求、处理请求、响应结果、跳转页面。
3.2.6 如何接收请求
对于servlet来说,提供接收前台提交请求的接口[HttpServletRequest]
3.2.7 完成登录案例
目的:探索servlet如何接收请求
项目结构:登录界面、接收提交请求、主页面
登录界面(login.jsp): |
---|
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录</title>
<style>
#content {
width: 300px;
height: 360px;
text-align: center;
margin: auto;
margin-top: 100px;
border: 10px solid green;
border-radius: 20px;
}
img {
width: 100px;
height: 100px;
border-radius: 20%;
}
</style>
</head>
<body>
<div id="">
<div id="content">
<form action="LoginServlet" method="get">
<h1>登录界面</h1>
<img alt="" src="img/01.jpg"><br><br>
账号:<input type="text" name="uname"><br><br>
密码:<input type="text" name="password"><br><br>
<input type="submit" name="提交登录">
</form>
</div>
</div>
</body>
</html>
主页面(index.jsp): |
---|
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1 color="red">我是主页面</h1>
</body>
</html>
业务代码(LoginServlet): |
---|
package pers.wcs.loginwork.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class LoginServlet
*/
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public LoginServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("我是servlet的get方法");
//通过请求获取提交的数据
String uname=request.getParameter("uname");
String password = request.getParameter("password");
//输出
System.out.println("账号:"+uname);
System.out.println("密码:"+password);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}