一、事先准备
1)首先要安装idea和tomcat,然后里面配置tomcat,创建web文件用到tomcat
2)然后我这里创建了 web应用文件
src里面写java程序,web里面写前端,jsp这个单独另外算,
3).jsp里面写东西
<%--
Created by IntelliJ IDEA.
User: master
Date: 2020-06-28
Time: 12:09
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<h1>hello world</h1>
</body>
</html>
4)在网页端运行java文件(XML配置)
注意啊,这里就用到了映射这个概念,你直接输入http://localhost:8080/Demo02_war_exploded/
,其实就是直接访问out/artifacts/Demo02_war_exploded/
但是访问java不可以直接用这样子访问,要配置映射才可以,哪里配置映射?xml文件里面
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<!-- name和下面的一样-->
<servlet-name>Myservlet</servlet-name>
<!-- 这个类的路径要一致-->
<servlet-class>com.qiang.Demo01.Myservlet</servlet-class>
</servlet>
<servlet-mapping>
<!-- name和上面一样-->
<servlet-name>Myservlet</servlet-name>
<!-- 下面的路径自己起的 -->
<url-pattern>/myservlet</url-pattern>
</servlet-mapping>
</web-app>
注意啊,这个xml文件配置了的,我们可以http://localhost:8080/Demo02_war_exploded/myservlet
访问java程序了,访问的东西是java里面的一个方法
java文件:
package com.qiang.Demo01;
import javax.servlet.*;
import java.io.IOException;
public class Myservlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
String id = servletRequest.getParameter("id");//传参数
System.out.println("服务端接受客户端的请求,参数为:"+id);//服务器给客户端的,在控制台显示
servletResponse.setContentType("text/html;charset=UTF-8");
servletResponse.getWriter().write("客户端接受到服务器端的回写");//服务器给客户端的,在网页端显示
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
5)注解方式配置(推荐)
注解非常简单,一行就解决
@WebServlet("/demo02")
public class Myservlet2 implements Servlet {
//code........
}
这样的效果和上面的XML配置是一样效果的
二、servlet生命周期
init()进行初始化,service()进行业务处理,destroy()进行Servlet的销毁
package com.qiang.Demo01;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/demo02")
public class Myservlet2 implements Servlet {
public void test(){
System.out.println("输出一句话");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("Servlet初始化");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Servlet进行业务");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("进行Servlet销毁");
}
}
多输入几次这个http://localhost:8080/Demo02_war_exploded/demo02
1)步骤
- 当浏览器访问Servlet时,tomcat回查询当前Servlet的实例化对象是否存在,如果不存在,则通过反射机制动态调用对象,如果存在,直接执行第三步
- 调用init进行初始化操作
- 嗲用service完成业务操作
- 关闭tomcat时,调用的destory,释放资源
2)Servlet生命周期方法:无参构造函数,init、service,destory
- 无参构造只调用一次,创建对象
- init只调用一次,初始化对象
- service调用N次,执行业务
- destory执行一次,卸载对象
三、ServletConfig
getServletName()
:返回servlet名称getInitParameter(String key)
:返回init参数的值(web.xml)getInitParameterNames()
:返回集合,包含所有的值getServletContext()
:返回ServletContext对象
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<context-param>
<param-name>username</param-name>
<param-value>user</param-value>
</context-param>
<servlet>
<!-- name和下面的一样-->
<servlet-name>Myservlet</servlet-name>
<!-- 这个类的路径要一致-->
<servlet-class>com.qiang.Demo01.Myservlet</servlet-class>
<!-- 局部俩变量开始-->
<init-param>
<param-name>username</param-name>
<param-value>admin</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123456</param-value>
</init-param>
<!-- 局部变量结束-->
</servlet>
<servlet-mapping>
<!-- name和上面一样-->
<servlet-name>Myservlet</servlet-name>
<!-- 下面的路径自己起的 -->
<url-pattern>/myservlet</url-pattern>
</servlet-mapping>
</web-app>
package com.qiang.Demo01;
import javax.servlet.*;
import java.io.IOException;
import java.util.Enumeration;
public class Myservlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("返回类名"+servletConfig.getServletName());//返回类名
System.out.println("局部变量username:"+servletConfig.getInitParameter("username")+"\n");
Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();
while (initParameterNames.hasMoreElements()){
System.out.println("迭代器中"+servletConfig.getInitParameter(initParameterNames.nextElement()));
}
ServletContext servletContext = servletConfig.getServletContext();
System.out.println("该项目名字"+servletContext.getContextPath());
System.out.println("服务器信息"+servletContext.getServerInfo());
System.out.println("全局变量的username:"+servletContext.getInitParameter("username"));
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
四、HttpServlet
HttpServlet 继承 GenericServlet 继承 Servlet
上面我们的Servlet,只有一个service这个函数有用而已,其他的平常生活都用不到,但是又要写那么多,所以简化什么的,日常都是用HttpServlet的多
而且HttpServlet里面的东西方便快捷又多
package com.qiang.Demo01;
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("/test")
public class MyHTTPservlet extends HttpServlet {
//以get方式返回的时候调用函数
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("GET");
}
//已post方式返回的时候调用函数
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("POST");
}
}
比如这个,他可以得知你是GET传值还是POST传值