浏览器无法直接访问src里面的东西,需要进行间接的配置进行访问。
一:web.xml的映射方式
浏览器访问:http://localhost:8080/test/demo没有反应,但是控制台输出
为什么url是http://localhost:8080/test/demo,而不是http://localhost:8080/demo呢?
因为当时自己配置的url的初始路径是方框标记出来的。
也就是当你访问初始url的时候,会访问index.jsp里面的文件。
MyServlet
package com.qianle.servlet; import javax.servlet.*; import java.io.IOException; public class MyServlet implements Servlet { @Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("haha"); } @Override public ServletConfig getServletConfig() { return null; } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("servlet is running"); servletResponse.getWriter().write("hello client"); # 给浏览器返回的字符串信息 } @Override public String getServletInfo() { return null; } @Override public void destroy() { } }
访问:http://localhost:8080/test/demo
返回中文浏览器乱码问题,返回之前设置文本类型和编码
@Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("servlet is running"); servletResponse.setContentType("text/html;charset=utf-8"); servletResponse.getWriter().write("你好中国"); }
获取查询字符串
@Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { // 获取查询字符串 String id = servletRequest.getParameter("id"); servletResponse.setContentType("text/html;charset=utf-8"); servletResponse.getWriter().write(id); }
访问:http://localhost:8080/test/demo?id=你好中国
二:注解的方式
清空web.xml里面的servlet文件和servlet-mapping
@WebServlet(urlPatterns = "/demo") public class MyServlet implements Servlet {
三:servlet的生命周期
package com.qianle.servlet; import javax.servlet.*; import javax.servlet.annotation.WebServlet; import java.io.IOException; @WebServlet(urlPatterns = "/demo") public class MyServlet implements Servlet { @Override # 1.先初始化方法 public void init(ServletConfig servletConfig) throws ServletException { System.out.println("进入init方法里面");; } @Override public ServletConfig getServletConfig() { return null; } @Override # 2.调用方法 public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("进入service方法里面"); } @Override public String getServletInfo() { return null; } @Override # 3.停止运行后调用 public void destroy() { System.out.println("进入destroy方法里面"); } }
访问 http://localhost:8080/test/demo 后控制台输出
连续访问http://localhost:8080/test/demo
init方法只在第一次访问的时候调用,其他的请求只调用service方法,只创建了一个servlet对象,类似于单例模式,节省内存开销
停止运行后
理解一下反射机制
Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键
MyServlet.class
package com.qianle.servlet; import javax.servlet.*; import javax.servlet.annotation.WebServlet; import java.io.IOException; @WebServlet(urlPatterns = "/demo") public class MyServlet implements Servlet { public MyServlet(){ System.out.println("无参数构造MyServlet对象"); } @Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("init");; } @Override public ServletConfig getServletConfig() { return null; } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("service"); } @Override public String getServletInfo() { return null; } @Override public void destroy() { System.out.println("destroy"); } }
Tomcat_test.java
package com.qianle.servlet; import java.lang.reflect.Constructor; public class Tomcat_test { public static void main(String[] args) { String str = "com.qianle.servlet.MyServlet"; # 定义路径字符串 try { Class obj = Class.forName(str); # 通过字符串找到类名 Constructor method1 = obj.getConstructor(); # 通过类名调用构造方法 Object instance = method1.newInstance(); # 通过构造方法的来创建对象 System.out.println(instance); }catch (Exception e){ e.printStackTrace(); } } }
运行后
了解初始化方法
getServletName()
@Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("init"); # com.qianle.servlet.MyServlet 全类型,就是带着包名的类名 System.out.println(servletConfig.getServletName()); }
注意:getInitParameter(参数名),读取的是配置文件里面的参数,也就是web.xml里面的参数,因此不能使用注解的形式访问
web.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> <servlet-name>haha</servlet-name> <servlet-class>com.qianle.servlet.MyServlet</servlet-class> <init-param> # 初始化参数 <param-name>name</param-name> # 参数名 <param-value>kobe</param-value> # 参数值 </init-param> </servlet> <servlet-mapping> <servlet-name>haha</servlet-name> <url-pattern>/demo3</url-pattern> </servlet-mapping> </web-app>
#
@Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println(servletConfig.getInitParameter("name")); }
方法的返回值是一个集合类型,可以通过迭代进行获取,
修改web.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> <servlet-name>haha</servlet-name> <servlet-class>com.qianle.servlet.MyServlet</servlet-class> <init-param> <param-name>name</param-name> <param-value>kobe</param-value> </init-param> <init-param> <param-name>password</param-name> <param-value>lakers</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>haha</servlet-name> <url-pattern>/demo3</url-pattern> </servlet-mapping> </web-app>
# 迭代
@Override public void init(ServletConfig servletConfig) throws ServletException { Enumeration<String> enumeration = servletConfig.getInitParameterNames(); while (enumeration.hasMoreElements()){ System.out.println(enumeration.nextElement()); } }
返回的对象是一个类似于集合容器,所有输出的数据无序
# TODO