目录
- 服务器
- 服务器的认识
- Tomcat服务器
- Tomcat服务器的介绍
- Tomcat的安装
- Tomcat报错的情况
- Tomcat要启动成功的条件
- JavaWeb项目
- Web的项目结构
- 发布项目的第一种方式
- 发布项目的第二种方式
- Eclipse中搭建动态Web项目
- eclipse安装Tomcat插件
- servlet
- servlet示例
- servlet的执行流程
- servlet分析
- servlet的生命周期
- ServletConfig
- get和post的区别
- HttpServletRequest对象
- HttpServletResponse对象
服务器
服务器的认识
java代码要用web服务器运行起来,才能被浏览器访问的到。
Tomcat服务器
Tomcat服务器的介绍
- web服务器:用来运行我们的web(java)项目。运行起来我们的项目才能被浏览器(不仅仅是我自己的浏览器同一个局域网其他的也行)访问
- 开源、免费、轻量级
- 基于java代码写的,运行时需要java环境
A:编辑环境变量,JAVA_HOME,(jdk的安装目录)
B:path里面编辑一个值,%JAVA_HOME%\bin
Jdk1.8只需要配置这么多就行了
Tomcat的安装
解压即安装
Tomcat报错的情况
- 端口被占用
- 写了中文但server.xml不是utf-8的编码 (记事本选文件选另存为选UTF-8)
Tomcat要启动成功的条件
- 下载tomcat8解压(不需要安装 不用配置tomcat的环境变量)
- 一定要有java环境,其中一定要有JAVA_HOME,jdk版本要对 ( java -version (cmd) )
- 其他起来里面报404是因为webapps里没有文件,如果里面有文件还是报404,可能是改了配置文件(重新解压原来的tomcat)
JavaWeb项目
Web的项目结构
web.xml可以不要,也可以去tomcat里面找
发布项目的第一种方式
html文件挡在项目根目录里面(与WEB-INF同级)
启动tomcat,访问http://localhost:8080/OA/test.html
不推荐
发布项目的第二种方式
Eclipse中搭建动态Web项目
1.新建动态web项目,项目名称随便写
2.定义字节码文件存放的位置
3.内容目录与前面对应,勾选创建web.xml
4.把Html文件放入webapp目录里
5.把该项目webapp的路径放入Tomcat的server.xml里
启动Tomcat
访问http://localhost:8080/test3.html
tips:
动态的web项目可以写jsp java代码,静态项目只能写html
新建项目后未能显示:下三角标 - Select Working Set - edit - add
WEB-INF下的classes是放字节码文件的 eclipse默认不显示,只有不显示才是正常的(害怕你删字节码文件)
我们可以之间去工作空间看classes文件是否存在
eclipse安装Tomcat插件
上面这种方式比较麻烦,每次都要去tomcat的安装目录里去启动,我们可以在eclipse里安装和配置Tomcat插件来方便操作,方式如下
1.把以下插件文件放到Eclipse文件夹下的plugins文件夹里,然后重启
2.把插件关联到Tomcat
servlet
servlet示例
上述只能访问html,不能访问java,如果要访问java,必须要用servlet
导包
tips:
如何导入并查看源码?
见视频
eclipse输入提示怎么打开?
打开Eclipse并点击顶部菜单栏上的“Window”菜单项。
在下拉菜单中,选择“Preferences”选项。
在打开的窗口中,导航到“Java” > “Editor” > “Content Assist”。
在右侧窗格中,找到“Auto Activation”部分,并勾选“Enable auto activation”复选框。
在“Auto Activation triggers for Java”字段中,输入字符(“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.”),用于触发代码提示。您可以输入多个字符,但请注意不要删除现有字符。
单击“OK”按钮保存更改。
HttpServletTest
public class HttpServletTest extends HttpServlet {@Overridepublic void init() throws ServletException {// TODO Auto-generated method stubsuper.init();System.out.println("初始化");}@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// TODO Auto-generated method stubsuper.service(req, resp);System.out.println("服务");}@Overridepublic void destroy() {// TODO Auto-generated method stubsuper.destroy();System.out.println("销毁");}
}
servlet建好后,需要用web.xml来访问
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"><display-name>TomcatAndservlet</display-name><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>default.html</welcome-file><welcome-file>default.htm</welcome-file><welcome-file>default.jsp</welcome-file></welcome-file-list><servlet><servlet-name>HttpServlet</servlet-name><servlet-class>com.itsource.servlet._02HttpServlet.HttpServletTest</servlet-class></servlet><servlet-mapping><servlet-name>HttpServlet</servlet-name><url-pattern>/xx</url-pattern></servlet-mapping>
</web-app>
访问:localhost/xx
servlet的执行流程
servlet分析
1.servlet的作用就是让我们的浏览器能访问到java代码
2.servlet是规范,java不去实现,由各大服务器厂商去实现
3.所以tomcat里面就有对servlet的实现包 jar
servlet的生命周期
LifeServlet
public class LifeServlet extends HttpServlet{public LifeServlet(){System.out.println("出生");}@Overridepublic void init() throws ServletException {System.out.println("取名,上户口");}@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("工作");}@Overridepublic void destroy() {System.out.println("立遗嘱,正常死亡");}
}
web.xml
<servlet><servlet-name>LifeServlet</servlet-name><servlet-class>com.itsource.servlet._03LifeServlet.LifeServlet</servlet-class></servlet><servlet-mapping><servlet-name>LifeServlet</servlet-name><url-pattern>/xxx</url-pattern></servlet-mapping>
启动tomcat,浏览器多次访问http://localhost/xxx,正常停止tomcat,看控制台
信息: Server startup in 632 ms
出生
取名,上户口
工作
工作
工作
十一月 20, 2023 3:20:25 下午 org.apache.catalina.core.StandardServer await
信息: A valid shutdown command was received via the shutdown port. Stopping the Server instance.
十一月 20, 2023 3:20:25 下午 org.apache.coyote.AbstractProtocol pause
信息: Pausing ProtocolHandler ["http-nio-80"]
十一月 20, 2023 3:20:25 下午 org.apache.coyote.AbstractProtocol pause
信息: Pausing ProtocolHandler ["ajp-nio-8009"]
十一月 20, 2023 3:20:26 下午 org.apache.catalina.core.StandardService stopInternal
信息: Stopping service Catalina
立遗嘱
十一月 20, 2023 3:20:26 下午 org.apache.catalina.core.ApplicationContext log
信息: SessionListener: contextDestroyed()
< load-on-startup >:启动tomcat时即执行了构造与初始化方法,后面访问只会执行service方法
放在< servlet-class >下面,值不为负数,数值越大优先级越高
<servlet><servlet-name>LifeServlet</servlet-name><servlet-class>com.itsource.servlet._03LifeServlet.LifeServlet</servlet-class><load-on-startup>0</load-on-startup></servlet><servlet-mapping><servlet-name>LifeServlet</servlet-name><url-pattern>/xxx</url-pattern></servlet-mapping>
两种说法
ServletConfig
可以拿到配置参数,了解即可,有时候可以用来解决硬编码的问题,比如设置字符编码集
web.xml
<servlet><servlet-name>LifeServlet</servlet-name><servlet-class>com.itsource.servlet._03LifeServlet.LifeServlet</servlet-class><init-param><param-name>encode</param-name><param-value>UTF-8</param-value></init-param><load-on-startup>0</load-on-startup></servlet><servlet-mapping><servlet-name>LifeServlet</servlet-name><url-pattern>/xxx</url-pattern></servlet-mapping>
LifeServlet
@Overridepublic void init(ServletConfig config) throws ServletException {System.out.println(config.getServletName());System.out.println(config.getInitParameter("encode"));System.out.println("init...");;}
get和post的区别
可以用@WebServlet注解取代在web.xml里配置servlet,简化编写流程
@WebServlet("/web")
public class MethodServlet extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("get方法");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("post方法");}
}
webapp下新建User.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body><form action="/web" method="get">账号:<input type="text" name="name"><br>密码:<input type="password" name="password"><input type="submit" value="get"></form><br><form action="/web" method="post">账号:<input type="text" name="name"><br>密码:<input type="password" name="password"><input type="submit" value="post"></form>
</body>
</html>
浏览器访问测试:http://localhost/User.html,两个按钮会走到对应的方法
doGet方法和doPost方法可以合并为service方法,不管post或get请求,都会走service方法
@WebServlet("/web")
public class MethodServlet extends HttpServlet{@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("我是service...");}
}
HttpServletRequest对象
可以拿到请求里的各种信息
@WebServlet("/web")
public class MethodServlet extends HttpServlet{@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");String name = req.getParameter("name");String password = req.getParameter("password");System.out.println("name: "+name);System.out.println("password: "+password);String accept = req.getHeader("Accept");System.out.println("Accept: "+accept);}
}
HttpServletResponse对象
用来向前端返回信息
@WebServlet("/web")
public class MethodServlet extends HttpServlet{@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");String name = req.getParameter("name");String password = req.getParameter("password");System.out.println("name: "+name);System.out.println("password: "+password);String accept = req.getHeader("Accept");System.out.println("Accept: "+accept);resp.setContentType("text/html;charset=utf-8");PrintWriter writer = resp.getWriter();if(!"小王".equals(name)){writer.print("<H1>账号不正确<H1>");return;}if(!"123456".equals(password)){writer.print("<H1>密码不正确<H1>");return;}writer.print("<H1>登录成功<H1>");}
}