JavaEE
个人整理非商业用途,欢迎探讨与指正!!
JavaEE是企业级开发
是综合性非常强的阶段
包含的知识点:JavaSE,MySQL,JDBC,WEB(HTML,CSS,JS,前端框架),Servlet,JSP,XML,AJAX等技术
目录
- JavaEE
- 1.服务器
- 2.Tomcat服务器
- 2.1Tomcat的使用
- 2.2Tomcat的目录结构
- 2.3Tomcat的启动和关闭
- 2.4eclipse下配置tomcat
- 3.Servlet的基本使用
- 3.1编写第一个Servlet程序
- 3.2Servlet的访问
- 3.3Servlet的配置
- 3.4Servlet配置需要注意的问题
- 3.5Servlet的版本变化
- 3.5.1Servlet接口
- 3.5.2GenericServlet抽象类
- 3.5.3HttpServlet抽象类
- 4.GET和POST请求
- 4.1发送GET请求
- 4.2发送POST请求
- 5.Servlet中的核心对象
- 5.1HttpServletRequest对象
- 5.2通过request获取表单中的请求参数
- 5.3常见的HTTP状态码
- 5.4request中的乱码问题处理
- 5.5HttpServletResponse对象
1.服务器
JavaEE项目需要运行在服务器之上
WEB服务器就是WEB项目的容器,WEB项目的运行环境,将项目部署到服务器下,可以通过服务器路径给用户直接浏览访问
静态资源
网页中保持不变的,没有后端请求的(HTML/CSS/JS/图片等)
动态资源(WEB服务器上运行动态资源)
会随着不同的请求,发生不同的变化
常见开发中的服务器产品
Tomcat(apache开源服务器,与sun公司合作,主流的web服务器之前,springboot中内置的服务器)
Jetty(效率比tomcat要高,安装相比tomcat麻烦一些)
WebLogic(Oracle 收费)
WebSphere(IBM服务器)
Nginx(静态资源服务器)
2.Tomcat服务器
Apache的开源项目,tomcat是开源免费的,因为和sun公司进行合作,支持最新的JSP和Servlet的语法
企业中主流的使用Tomcat8.5和Tomcat9版本(Tomcat10也有使用)
各版本之间最大的差别是对Servlet(运行在服务器下的Java类)的规范支持
Tomcat有安装版和解压版的区别
(目录结构是一样的,以及后面的搭建方式是相同的,本次课程给大家提供的是Tomcat8.5解压版)
2.1Tomcat的使用
开箱即用
注意:开箱时目录的层级不要太多,开箱路径中不要有中文
例如:D:\apache-tomcat-8.5.20\apache-tomcat-8.5.20
2.2Tomcat的目录结构
bin 存放服务器启动和关闭相关的二进制文件
conf tomcat的配置相关文件(server.xml可以配置当前服务器的端口等信息,web.xml当前服务器的全局文件)
lib tomcat是java开发的,lib中存放的是支持的jar环境
logs 存放日志文件,服务器相关的各种信息
temp 临时文件夹
webapps 管理web项目的,默认情况下web项目要部署到该路劲下(eslipse需要手动配置,idea可以自动配置)
work 存web项目的动态页面(JSP:Java Server Page)转换的java文件的
2.3Tomcat的启动和关闭
startup.bat 启动服务器 关闭则可以直接关闭服务器
不能同一个端口启动多次(一个端口只能启动一次)
tomcat若无法启动,则需要查看JDK的环境变量是否正常配置,tomcat是由java开发的
必须有正确的JAVA_HOME配置
2.4eclipse下配置tomcat
3.Servlet的基本使用
Servlet是JavaEE规范的一部分,Servlet需要JavaEE的环境支持
环境支持:JDK环境,服务器环境
Servlet是一个运行在服务器下的类,由服务器进行创建对象
Servlet的本质是Java类
3.1编写第一个Servlet程序
// 外部(浏览器)访问我们Servlet的路径
@WebServlet("/HelloServlet")
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("你访问到我了呦");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("你访问到我了呦");
}
}
3.2Servlet的访问
1.在服务器下启动当前的项目
Run On Server --> finsh 服务器和项目一起被启动了,项目可以被访问了
2.访问路径
http://localhost:8080/20240112-01-HelloServlet/HelloServlet
当前地址表示着访问服务器下的Servlet类
3.3Servlet的配置
在Servlet3.0后有两种配置方案:
1.基于注解的方式(更加便捷,更加方便)
@WebServlet(路径)
路径是必须由/开始
注解是将Java类配置到服务器下,可以被直接访问(浏览器访问服务器,然后读取到了一个Java类)
2.基于配置文件的方式
web.xml文件,该文件每个项目都只有一个
在WebContent/WEB-INF/web.xml文件中进行配置
xml文件是和html同公司(www3cSchool)发布的产品,特点都是由标签组成(标记,节点)
xml的特点是区分大小写,所有标签必须是闭合的(双标签<xx></xx> 单标签<xx/>)
xml中只有一个根节点
xml最初被创建的作用是数据传输的,但是xml特别的笨重
xml现在多用于配置文件
<!-- 使用xml的形式进行配置servlet -->
<!-- 注册Servlet -->
<servlet>
<!-- 名字任意 -->
<servlet-name>ok</servlet-name>
<!-- 需要被注册的servlet -->
<servlet-class>com.qf.servlet.OkServlet</servlet-class>
</servlet>
<!-- 映射,外部的访问方式 -->
<servlet-mapping>
<!-- 名字和上面一样 -->
<servlet-name>ok</servlet-name>
<!-- 外部的访问路径 -->
<url-pattern>/ok</url-pattern>
</servlet-mapping>
3.4Servlet配置需要注意的问题
url-pattern不能重复
url-pattern必须以/开头
3.5Servlet的版本变化
接口版本
Servlet
模板化抽象类版本
GenericServlet
Http协议抽象类版本(自动生成的版本)
HttpSerlet
3.5.1Servlet接口
Servlet接口中包含了Servlet生命周期相关方法(4个)(来到没的过程)
1.构造方法 只调用一次,服务器创建的同时为Servlet创建对象
2.初始化方法 只调用一次,用于对当前的Servlet进行初始化信息
3.服务方法 可以调用多次,每次的浏览器的访问都会调用一次(请求的过程)
4.销毁方法 只调用一次,服务器正常终止时调用,或者源码改变时调用
@WebServlet("/my")
public class MyServlet implements Servlet{
public MyServlet() {
System.out.println("构造方法");
}
@Override
public void destroy() {
System.out.println("销毁方法");
}
@Override
public ServletConfig getServletConfig() {
System.out.println("servlet配置");
return null;
}
@Override
public String getServletInfo() {
System.out.println("servlet信息");
return null;
}
@Override
public void init(ServletConfig arg0) throws ServletException {
System.out.println("初始化方法");
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
System.out.println("服务方法");
}
}
3.5.2GenericServlet抽象类
抽象类中将Servlet接口进行实现,只预留一个service抽象方法,将冗余代码简单化
public class LoginServlet extends GenericServlet{
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
System.out.println("嗨嗨嗨");
}
}
3.5.3HttpServlet抽象类
没有任何的抽象方法,就是用于被继承
HttpServlet是针对HTTP协议定制的,内部将service方法根据不同的请求方式分割为不同的doXxx方法
doXxx针对get/post等请求定制
例如:doGet方法接收get请求,doPost方法接收post请求
doXxx方法中,将ServletRequest和ServletResponse
转换为HttpServletRequest和HttpServletResponse
@WebServlet("/hello")
public class HelloServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get请求");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("post请求");
}
}
将service进分割
public class LoginServlet extends GenericServlet{
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
// 将ServletRequest和ServletResponse转换为HttpServletRequest和HttpServletResponse
HttpServletRequest request = (HttpServletRequest) arg0;
HttpServletResponse response = (HttpServletResponse) arg1;
// 将service分割为不同的doXxx方法
// 获取请求方式
String method = request.getMethod();
System.out.println("请求方式:"+method);
switch (method) {
case "GET":
doGet(request,response);
break;
case "POST":
doPost(request,response);
default:
break;
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
System.out.println("我处理post请求");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
System.out.println("我处理get请求");
}
}
// 使用我们自己的分割方案
@WebServlet("/ok")
public class OkServlet extends LoginServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
System.out.println("我是ok中get请求");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
System.out.println("我是ok中的post请求");
}
}
4.GET和POST请求
浏览器向服务器发送请求的主要方式:GET和POST
4.1发送GET请求
1.浏览器地址栏
2.超链接
3.form的默认方式(method=get)
4.url重写的方式,使用? = &进行url拼接
浏览器地址栏
http://localhost:8080/20240113-03-GET%E5%92%8CPOST%E8%AF%B7%E6%B1%82/LoginServlet
超链接
<!-- href指向urlpattren -->
<a href="LoginServlet">跳转</a>
method=get
<!-- action指向urlpattern -->
<form action="LoginServlet" method="get">
<input type="submit">
</form>
url重写
http://localhost:8080/20240113-03-GET%E5%92%8CPOST%E8%AF%B7%E6%B1%82/LoginServlet?username=tom&password=123
4.2发送POST请求
form的method=post
<!-- action指向urlpattern -->
<form action="LoginServlet" method="post">
<input type="submit" value="POST">
</form>
5.Servlet中的核心对象
主要有两个:
HttpServletRequest和HttpServletResponse
代表着请求和响应
5.1HttpServletRequest对象
该对象由服务器进行创建并赋值
request中封装了所有的请求信息
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public LoginServlet() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// request封装了所有的请求数据
String method = request.getMethod();
System.out.println("请求方式:"+method);
// 请求的url
StringBuffer requestURL = request.getRequestURL();
System.out.println(requestURL);
// url后的参数
String queryString = request.getQueryString();
System.out.println(queryString);
// 通过url中的key获取对应的value key就是请求路径中的? key = value & xxx = xxx
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println(username+":"+password);
String gender = request.getParameter("gender");
System.out.println(gender);
// 获取协议的版本
String protocol = request.getProtocol();
System.out.println(protocol);
String remoteAddr = request.getRemoteAddr();
System.out.println(remoteAddr);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 没有特殊要求的情况下,我们的所有请求的处理方案是一样的(REST风格的URL,对请求方式有特殊的说明)
doGet(request, response);
}
}
//http://localhost:8080/20240115-04-Servlet%E4%B8%AD%E6%A0%B8%E5%BF%83%E5%AF%B9%E8%B1%A1/LoginServlet?username=tom&password=123&gender=%E7%94%B7
5.2通过request获取表单中的请求参数
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// form中通过name或者value
String departmentname = request.getParameter("departmentname");
String local = request.getParameter("local");
// 封装起来
Department dept = new Department(0,departmentname,local);
System.out.println(dept);
// 完成JDBC操作,添加数据添加到数据库中(作业)
}
<form action="AddDeptServlet" method="get">
<!-- name属性用于后端取值使用 例如:name=local 将会拼接数据为local=xxx的形式-->
部门名称:<input type="text" name="departmentname"><br>
部门地址:<input type="text" name="local"><br>
<input type="submit" value="添加">
</form>
5.3常见的HTTP状态码
200表示成功
302表示服务器重定向
304表示服务器缓存资源
404表示资源不存在,4xx就是浏览器资源错误
500表示服务器端错误,5xx表示服务器端资源错误
5.4request中的乱码问题处理
get请求
tomcat7之后,所有的中文是默认处理完的
post请求
需要对request对象进行编码集的设置
// 设置请求的编码格式
request.setCharacterEncoding("utf-8");
5.5HttpServletResponse对象
封装了所有的响应信息
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置请求和响应的编码格式
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");
// 所有通过请求获取的参数类型都是String
String username = request.getParameter("username");
String password = request.getParameter("password");
// 使用response获取到页面的打印流
PrintWriter out = response.getWriter();
// 常规应该做JDBC操作
if("王成輝".equals(username) && "123456".equals(password)) {
// System.out.println("登录成功");
// 一般不会使用打印流 打印过多的内容
// out.print("<label style='color:green;'>登录成功</label>");
// 页面跳转
response.sendRedirect("success.html");
}else {
// System.out.println("登录失败");
// out.print("<label style='color:red;'>登录失败</label>");
response.sendRedirect("fail.html");
}
}