tomcat bin startup启动服务器 shutdown关闭服务器 conf(配置文件夹) server.xml 服务器配置文件(端口号) web.xml lib(架包) logs(日志) temp(临时文件) webapps(写好的代码,部署的项目) work(放jsp) servlet(java代码) ) javac -d . -cp servlet-api.jar FirstServlet.java 手动部署 1.文件夹下新建WEB-INF,下建立classes(放java字节码文件)和lib(jar包)文件将配置好的web.xml放到web-inf 文件夹下 2.将上述文件放到tomcat下的webapps文件夹下 3.http://ip:port/项目名/资源名 http://127.0.0.1:8181/tylg_servlet/FirstServlet重新部署 servlet 实现servlet接口 <servlet> <servlet-name>firstservlt</servlet-name>//用来匹配servlet—mapping <servlet-class>com.briup.web.servlet.FirstServlet</servlet-class>java类的包名加类名 </servlet> <servlet-mapping> <servlet-name>firstservlt</servlet-name>//用来匹配servlet <url-pattern>/firstServlet</url-pattern>//资源路径 </servlet-mapping> 响应过程 http://ip:port/项目名/资源名 http://127.0.0.1:8181/tylg_servlet/FirstServlet 服务器得到get请求,通过ip和端口号找到tomcat,在tomcat中找到webapps,如果是页面,直接访问如果是java在web-inf中找到web.xml。在xml里通过路径的资源名和url-pattern匹配找到servlet-mapping,在servlet-mapping中通过servlet-name匹配servlet标签,通过servlet-class找到对应的java运行文件 继承Genericservlet 实现service方法(自动调用) http://127.0.0.1:8181/tylg_servlet/SecondServlet 继承HttpServlet service(HttpServlet req,HttpServletResponse resp)仅拦截http协议的请求 service(ServletRequest arg0, ServletResponse arg1)所有请求都会拦截 init(初始化)destroy(消亡) 第一次访问的时候创建对象(init方法)(tomcat的service容器)并调用servlet方法,第二次再发请求时不创建新对象,使用第一次启动的时创建的对象,调用servlet方法(单例模式)当服务器停掉的时候调用destro有方法回收对象 在web.xml里的servlet标签加<load-on-startup>1</load-on-startup>可以设置是否在服务器启动时创建对象 数字越接近0越早创建,负数则不创建 单例模式 class Test{//懒汉模式判断是否存在,不存在创建新对象 private Test test; private Test(){} public Test getTest(){ if(test!=null){ test=new Test(); } return test; } } class Test{//饿汉模式先创建对象 private Test test=new Test(); private Test(){} public Test getTest(){ return test; } } webcontent下方html页面 天生多线程,线程不安全 为服务器设置重新加载servers -》context.xml-》<context reloadable="true"> get/post传参方式(key=value) get(将参数用地址的方式传递)getParameter 不安全,有长度限制 doGet 超链接,form表单,ajax http://127.0.0.1:8181/tylg_servlet/param.html 当发一个请求,资源存在,将请求封装成httprequest对象(web服务器)作为参数发送给service方法 http://127.0.0.1:8181/tylg_servlet/param.html http://127.0.0.1:8181/tylg_servlet/ParamServlet?name=zhang3&age=10 post参数在请求头 form表单methed属性设置为post doPost只接受post传参 解决乱码 server.xml 修改端口号的地方URIEncoding="编码方式" req.setCharacterEncoding("UTF-8"); resp.setContentType("text/html;charset=utf-8");设置内容类型 发送请求的方式(五种) http://127.0.0.1:8181/tylg_servlet/register.html 跳转: 服务器内部跳转 RequestDispatcher rdis=req.getRequestDispatcher("error.html"); rdis.forward(req, resp);//传递请求 forward仅跳转 req.getRequestDispatcher("success.html").include(req, resp); include将其他的东西包含进页面一起显示 浏览器请求(form的active)-》1.java(req.getRequestDispatcher("2").include(req, resp);)->web.xml->2.java->浏览器 一个请求一个回应 浏览器发一个请求,请求在服务器内传递(向下转发),完成后向浏览器发一个响应 客户端重定向 新的请求 resp.sendRedirect("error.html"); 路径问题 相对路径 ./回到上一级目录 ../回到上两级目录 绝对路径 / 范围 application page ServletContext app= session.getServletContext(); session HttpSession session =req.getSession(); session会话(每个浏览器jsessionid标识)保存在服务器端的一个对象,客户端没有,浏览器以Cookie的形式将jsessionid发送到服务器,以验证会话的一致性 在web配置 <session-config> <session-timeout>1</session-timeout> </session-config> 修改会话保存时间 cookie(自动登陆)会话追踪客户端(本地文件)和服务器端(java对象)都有 request url重写 将JsessionId以post或get方式发给服务器 过滤器 implements Filter 判定合法性 <filter> <filter-name>firstfilter</filter-name> <filter-class>com.briup.web.filter.FirstFilterTest</filter-class> </filter> <filter-mapping> <filter-name>firstfilter</filter-name> <url-pattern>/*(所有请求都会过滤)</url-pattern>地址中出现的路径才会被过滤器过滤 </filter-mapping> 监听器当事件触发时调用监听器 <listener> <listener-class>com.briup.web.listener.SessionListener</listener-class> </listener>