提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
硬件服务器=大的计算机:有操作系统
web项目:在当前服务器上部署:其他客户端通过网络传输可以访问:达到实现资源共享的目的
一、tomcat是什么?
Tomcat是一种开源的Web服务器和Servlet容器,它是Apache软件基金会的一个子项目。Tomcat可以作为Java Servlet和JavaServer Pages(JSP)技术的运行环境,用于开发和部署Java Web应用程序。它能够将静态页面、JSP、Servlet、以及一些Java应用程序如Struts、SpringMVC和JSF等转化为动态网页输出。Tomcat常用于开发和部署Java Web应用程序,它免费且跨平台。
二、安装步骤及使用过程出现的问题
2.1.安装tomcat
安装tomcat不要在中文路径下!比如:下载
2.2.了解tomcat: 目录结构
2.3.找到接口-浏览器打开判断是否成功启动
2.3.1.sh startup.sh 启动tomcat
jps
2.3.2. 查找到接口为8080:打开浏览器输入网址:ip+端口,再在终端输入jps得到Bootstrap
#netstat -anlp | grep java
jps出现了Bookstrap:指浏览器成功打开了tomcat
2.3.3.关闭Bookstrap的两种方式
1.kill -9 24245(数字串) 2.ls 后 sh shutdown.sh
2.4.发布容器;IDEA里的tomcat
开发工具:
idea develop tooler otherversion
2.5.找不到jdk:自身原因:有两个jdk地址,但只有一个用作配置环境:
2.5.1.step1:一开始新建文件选择的jdk路径和新建文件后file|setting|runner :jre:Use Project JDK(路径统一)和Project Structure路径统一
2.5.2.step2:能够打开Run控制台但报错显示.....catalina/localhost:权限不够(图文不符,忘截图了)
2.5.3.step3:conf/Catalina 也要修改权限,下图为运行成功
2.5.4.成功运行并自动打开网页:但网址显示的是子站
修改:给出的url是默认的 可以改为主页
Server
Deployment :的application context要保留根目录
2.5.5.直接在tomcat8.5/webapps/ROOT 删掉ROOT 将其他子站文件名改为ROOT
6.端口占用问题:在IDEA中改为8081,1098;看目录结构:在confi/servlet.xml中修改
三.Servlet的实现
3.1.IDEA2022创建项目(与2019不同)
先新建普通项目:新建module和包再新建web:在ServletDemo module右键-add Frameworks Support添加框架支持
出现web包
加入configration
运行一下,再在项目下新建testservlet
继承HttpsServlet后无法导包:在web/WEB-INF/下新建lib,复制servlt-qpi.jar(在文件夹中搜索)进去,再右键选择add as directory
是HttpServlet不是httpsServer
3.2.IDEA2022<url-parten>
通过注解起名@WebServlet(“网址”);
相当于原始配置方式:
四、Servlet的生命周期
:结果是init只打印即运行一次,service可以多次打印,关闭网页时控制台才会出现destroy()
五、HttpServletRequest对象
5.1.获取请求参数
地址栏带参数输入时,从浏览器传递:控制台打印 :?xxx&xxx&xxx
String uname = req.getParameter("uname");//获取特定的参数
System.out.println("指定的uname:"+uname);
String pwd = req.getParameter("pwd");
System.out.println("指定的pws:"+ pwd);
String[] hobbies = req.getParameterValues("hobby");//多个相同参数名的参数,数组
System.out.println("hobbies:"+ Arrays.toString(hobbies));
5.2.请求中文乱码问题:情景输入姓名
//在getParameter前面固定编码格式
req.setCharacterEncoding("UTF-8");
String uname = req.getParameter("uname");
//特定内容转变
//中文乱码解决方式:
String uname = new String(req.getParameter("uname").getBytes("ISO-8859-1"), "UTF-8");
System.out.println("login传入的Name:"+uname);
似乎低版本的tomcat方式一 只适用于 POST方法,GET不行?
5.3请求转发
req.getRequestDispatcher("xxx").forward(req,resp);
请求响应后,地址不变,服务器端行为,浏览器感知不到页面内容的跳转;
req.getRequestDispatcher("xxx").forward(req,resp); xxx只能是服务器内的,比如不能跨域访问百度
例子:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="s04" method="get">
<%-- action的地址没有“/”是因为默认web与src是在同一个目录下的--%>
username:<input type="text" name="uname">
password:<input type="password" name="pwd">
<input type="submit" value="login">
</form>
</body>
</html>
package testservlet;
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 java.io.IOException;
//请求转发
@WebServlet("/s04")
public class Servlet04 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String uname = req.getParameter("uname");
System.out.println("s04-name:"+uname);
//请求转发:jsp也可以
req.getRequestDispatcher("s041").forward(req,resp);
// req.getRequestDispatcher("login.jsp").forward(req,resp);
System.out.println("---back to s04");
}
}
package testservlet;
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 java.io.IOException;
@WebServlet("/s041")
public class Servlet041 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String uname = req.getParameter("uname");
System.out.println("s041-uname:"+uname);
}
}
5.4HttpServletRequest对象的使用
域对象的共享方法 .set/getParameter();
//s041:获取域对象中的数据
String age = (String) req.getParameter("age");
System.out.println("s041-age"+age);
//s04:域对象数据的共享
req.setAttribute("age","18");
String age=(String)req.getParameter("age");
System.out.println("s04--ag2:"+age);
6.HttpServletResponse对象
6.1响应数据
字符流/字节流
//响应数据:
//字符输出流的两种方式
resp.getWriter().write("hi..");//只能写文本,不能响应对象
resp.getWriter().print("hello");//写文本和对象都可以
//字节输出流,不与字符输出流共存,要转换 (少用)
// resp.getOutputStream().write("hi".getBytes());
设置响应头
6.2响应乱码问题
原因:
解决办法:
@WebServlet("/sr02")
public class Response02 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置传输过程中编码格式
resp.setCharacterEncoding("UTF-8");
//告诉浏览器编码时候的 编码格式
resp.setHeader("content-type","text/html;charset=UTF-8");
//响应中文字符给浏览器
resp.getWriter().print("你好");
}
}
总结:以后要想请求和响应都没有乱码问题,写Servlet上来就加入三句代码
//设置请求信息的编码格式
req.setCharacterEncoding("UTF-8");
//设置响应信息的编码格式
resp.setCharacterEncoding("UTF-8");
//设置浏览器的编码格式
resp.setContentType("text/html;charset=UTF-8");
6.3重定向
6.3.1.概念
resp.sendRedirect("xxx");//重定向
6.3.2.例子
@WebServlet("/rd01")
public class ResponseRedirect03 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取前台传过来的参数 请求req
String uname = req.getParameter("uname");
System.out.println("uname:"+uname);
//重定向
resp.sendRedirect("rd02");
System.out.println("重定向后打印");
}
}
@WebServlet("/rd02")
public class ResponseRedirect04 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//是否接受到重定向的数据
String uname = req.getParameter("uname");
System.out.println("重定向:"+uname);
}
}
地址栏输入:会跳转到rd2,返回的状态码是302和200;uname并不能传递到rd02
控制台:
6.3.3.原理:
6.3.4.服务器可以访问外部:比如sendRedict("https://baidu.com"),是成功的:是服务器引导,客户端执行,所以客户端可以响应rd2
6.4请求转发与重定向的区别
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了Servlet的使用