`

java-web:servlet

 
阅读更多

1.Servlet规范
1.1 规范了应用服务器 tomcat(Servlet容器,没有ejb容器) jboss weblogic(有Servlet容器,也有EJB容器)
1.2 规范了java web项目的一个结构.
1.3 规范了我们程序员所写的Servlet, 其实就是现实了一个Servlet接口

2.Servlet接口
init(ServletConfig);
1. 如果没有配置load-on-startup的时候在第一次访问的时候执行
2. 如果配置的load-on-startup是在服务器启动的时候执行

service(ServletRequest,ServletResponse)
任何一次请求都执行
destroy();
服务器正常关闭的时候执行.

3.Servlet的生命周期
1.在浏览器上面访问. http://www.itcast.cn:8080/bbs/myServlet

2.浏览器会根据www.itcast.cn,先到本机的host文件中找对应的IP地址,没有找到则到DNS服务器上面来解析出IP.

3.根据解析出来的IP和端口8080连接到服务器

4.浏览器要向服务器发送一个请求头:

GET /bbs/myServlet HTTP/1.1
Host: www.itcast.cn

5. 根据Host找Server.xml中找对应的虚拟主机

6. 找到虚拟主机后, 根据Context path="/bbs" 去掉path的值得到具体请求的资源 /MyServlet.

7. 根据具体请求的资源 /MyServlet到 Context docBase="" 中具体的资源.

8. 根据资源路径/MyServlet到web.xml匹配 url-pattern.
8.1 如果没有匹配上资源路径. 返回404,文件找不到..
8.2 找到了..匹配到url-pattern

9. 根据url-pattern找到servlet-name. 根据servlet-name的值到Servlet缓存中找Servlet对象
Servlet缓存:Map<String,Servlet> map = new HashMap<String,Servlet>();
servlet-name作为map键
Servlet对象作为map值
9.1 从缓存中找到 ... 直接执行..service....
9.2 从缓存中没有找到

10. 如果没有找到servlet对象.. 根据servlet-name找Servlet标签从而找到servlet-class

11. 根据servlet-class通过反射创建Servlet对象
Class clazz = Class.forName(servlet-class)
Servlet serlvet = (Servlet)clazz.newInstance(); //默认的无参的构造函数
同时要把该对象存入Servlet缓存中

12. Servlet容器创建一个ServletConfig对象,传递一个Servlet对象的init方法...

13. Servlet容器创建一个ServletRequest和一个ServletResponse,传递给service方法...


4. Servlet相关的API
4.1 ServletConfig
getInitParameter(String name);
getInitParameterNames();
getServletCoantext();
getServletName(); //web.xml中配置的servlet-name节点的值

4.2 HttpServletRequest //获取请求客户端的信息
getCookies();
getParameter(String name);
getParameterValues(String name);
getParameterMap(); //得到请求参数名字和值的键值对... String的键 String[]的值
getRequestURI(); 得到Host后面的资源路径,但是不带参数
getRequestURL(); 得到全路径
getRemoteAddr(); 得到IP
getHeader(String name) 得到请求头信息
getSession() 得到session
request.setCharacterEncoding("UTF-8")

4.2 HttpServletResponse //发送内容给客户端
setContentType("text/html;charset=utf-8")
setHeader(String name,String value) 设置响应头
sendRedirect(String location)

getWriter();
getOutputStream();

4. Servlet的继承体系:
Servlet 接口

GenericServlet实现Servlet接口,并且实现了ServletConfig.
就是让我们少写了一步获取ServletConfig对象

HttpServlet extends GenericServlet{

service(ServletRequest ,ServletResponse){
转成一个WEB相关的对象
HttpServletRequest request
HttpServletResponse response

String method = request.getMethod();
if(method.equ...get..){
doGET
}

if(method.equ...post..){
doPost
}

}
doGET{}
doPost{}

}


5. 处理请求的参数:
getParameter(String name);
getParameterValues(String name);
getParameterMap(); //得到请求参数名字和值的键值对... String的键 String[]的值


处理中文乱码的问题
5.1 GET请求
new String(request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8");
5.2 POST请求
request.setCharacterEncoding("UTF-8")

如果说响应中出现了乱码的话.
setContentType("text/html;charset=utf-8")

6. Cookie..
为什么要使用cookie. 因为HTTP协议是一个无状态的...

其实就是在浏览器上面保留一个【键和值】得文本内容. 如果保留了的话,再后面的请求中,浏览器都会主动的将这个信息发送给服务

器..

6.1 Cookie添加
Cookie cookie = new Cookie(String name,String value);
//默认的状态下是一个临时的cookie,该cookie保持中浏览器的内存中.. 如果浏览器关闭的话,cookie就消失

cookie.setMaxAge(); //秒.. //设置了时间的话就是持久的cookie,保持在硬盘上的..

response.addCookie(cookie); //响应头的set-cookie

6.2. cookie的查找
Cookie[] cookies = request.getCookies();
if(cookes!=null){
for(Cookie cookie: cookies){
if(cookie.getName().equals("指定的名字")){
cookie.getValue();
break;
}
}
}

6.3. 删除指定的一个cookie
//创建一个名字样的cookie从而覆盖原来的cookie. 并且需要设置改cookie的保留时间为0
Cookie cookie = new Cookie(String sameName,null);
cookie.setMaxAge(0);
response.addCooke(cookie);

6.4 更新指定的一个cookie
//创建一个名字样的cookie从而覆盖原来的cookie.
Cookie cookie = new Cookie(String sameName,String newValue);
response.addCooke(cookie);

6.5. cookie中文问题
因为cookie的传递是通过请求头和响应头来传递的.. 而在请求头和响应头中时不能够采用中文的, 所以说存储中文之前将其编码..

//添加之前编码
Cookie cookie = new Cookie(String name,URLEncoder.encode("中文","UTF-8"))
response.addCookie(cookie);

//接收到的时候,在对其进行解码
Cookie[] cookies = request.getCookies();
if(cookes!=null){
for(Cookie cookie: cookies){
if(cookie.getName().equlas("指定的名字")){
String value = URLDecoder.decode(cookie.getValue(),"UTF-8");
break;
}
}
}


7. Session...
cookie有一定的缺陷... cookie是放在客户浏览器端的,不安全.. 并且存储的数量和大小都限制. 所以使用Session

7.1 Session创建
//1. 根据请求上面看看有没有指定的jsessionid的cookie,根据jsessionid找对应的session,如果没有找到就会重新创建一个

session,从而将session生成一个编码以临时cookie的方式发送给浏览器....
HttpSession session = request.getSession(); Map<String,Object>
request.getSession(boolean create) ;///create如果为true的话和上面是一样的.. 如果为false的话,根据jsessionid找

不到对应的session,那么也不创建对象.

7.2 向session中设置内容
session.setAttribute(String name,Object object);
7.3 获取session中的内容
session.getAttribute(String name);
返回名字对应的值,如果没有对应值的话,返回null
7.4 session的特点
session的值保持在服务器上的..

如果浏览器不接受cookie的话, url重写的形式方法请求,然后再请求地址上面加上jsessionid

http://localhost:8080/myservlet;jsessionid=asdfasdflas8d9f7a9sf

response.encodeURL("");
response.encodeRedirectURL("");
这两个方法可以传入的字符串加上jsessionid

7.5. session的超期管理
为什么要使用session的超期管理.
因为session在服务器端保持,如果没有再使用的情况下需要释放占用的内存.如果不释放的话将会越来越多. 可能导致服务器内存

溢出..

7.1 session.invalidate();//直接释放掉
7.2 session.setMaxInactiveInterval(秒) //设置最大的活动时间间隔..
7.3 在当前项目的web.xml中配置session-config 中的session-timeout 分钟
7.4 如果当前项目的web.xml中没有配置. 那么默认的使用Tomcat/conf/web.xml中配置的session-config 中的session-timeout

分钟

优先级的顺序为:7.1>7.2>7.3>7.4


7.6 session的API
getId();
isNew();
getServletContext();

8. 共享控制
8.1 forward
强调的是将请求转发给下一个Servlet或者是资源

RequestDispacher rd = request.getRequestDispacher(/当前项目的资源路径)
rd.forward(request,response);

最后的目标资源决定发送给浏览器的内容.

转向的Servlet和当前Servlet使用的是内容一样的Request..

8.2 url重定向
浏览器看到响应码是302并且有一个响应头是Location. 那么浏览器就会自己来发送一个到Location

response.sendRedirect(String location)
8.3 include
强调的是将被包含的资源(Servlet,html) 的输出合并到当前Servlet中.一起输出给客户端..
RequestDispacher rd = request.getRequestDispacher("/当前项目的资源路径")
rd.include(requst,response)

被包含的资源和当前资源使用的是内容一样的Request和response

url重定向和forward的区别:
1>. 浏览器的地址是否发生改变:
forward不改变. 因为只发送了一次请求. 那么具体的转发是在服务器端进行的.
url重定向是改变的. 因为发送的下次请求的有浏览器发出的..

2>. 是否可以发送外部的资源
forward不可以
url重定向是可以的

3>. 是否可以访问WEB-INF下面的资源
forward是可以的
url重定向是不可以

4>. /的区别:
forward : 代表当前应用的根目录
url重定向: 代表当前服务器默认的项目的根路径.

在上面情况下使用 url重定向 和 forward的呢?
如果Servlet1 转到 Servlet2. 那么Servlet1 的一个运算结果需要Servlet2来处理. 那么必须使用forward的.
在Servlet1中将运算结果放在request.setAttribute(String name,Object object),然后在Servlet2里面可以

request.getAttribute(String name);获取到

其他的两种都可以...

8. 共享信息.
pageContext: jsp
Request(一次请求)
Session(一次会话)
ServletContext(整个WEB应用). 在线用户.

ServletContext在服务器启动的时候创建. 服务关闭的时候销毁,在这个web项目中只有一个对象. 存放在该对象中的属性值是被所有

用户和Servlet所共享.

在上面的对象中都相同的方法:
setAttribute(String name,Object object);
getAttribute(String name):Object
getAttributeNames()
removeAttribute(String name)

ServletContext中有重要的几个方法:
getRealPath("/") 得到当前应用的跟目录的绝对路径
getRealPath("/WEB-INF/web.xml")
getResourceAsStream("/web项目的相对路径") // 返回一个inputStream

getInitParameter(String name)根据名字获取在web.xml中配置的初始化参数
<context-param>
<param-name>configPath</param-name>
<param-value>/WEB-INF/db.properties</param-value>
</context-param>

getContextPath() ;//得到当前应用的虚拟路径,在server.xml中配置的Context的path的值..

分享到:
评论

相关推荐

    sentinel-web-servlet-1.8.0-API文档-中英对照版.zip

    赠送jar包:sentinel-web-servlet-1.8.0.jar; 赠送原API文档:sentinel-web-servlet-1.8.0-javadoc.jar; 赠送源代码:sentinel-web-servlet-1.8.0-sources.jar; 赠送Maven依赖信息文件:sentinel-web-servlet-...

    JAVAWEB-08:Servlet基础&java web之request/respone

    &lt;servlet-name&gt;MyServlet&lt;/servlet-name&gt; &lt;servlet-class&gt;com.example.MyServlet&lt;/servlet-class&gt; &lt;/servlet&gt; &lt;servlet-mapping&gt; &lt;servlet-name&gt;MyServlet&lt;/servlet-name&gt; &lt;url-pattern&gt;/myPath&lt;/url-pattern&gt; ...

    Tomcat-PHP: script-api.jar,php-servlet.jar,php-script.jar,JavaBridge.jar

    Tomcat是Apache软件基金会...总结起来,"Tomcat-PHP"的集成涉及到Java Servlet技术、JavaBridge以及相关jar文件的使用,这些工具和库使得在Java的Tomcat服务器上运行PHP应用程序成为可能,实现了跨语言的Web应用开发。

    深入Java Web心脏:Servlet工作原理全解析

    &lt;servlet-class&gt;HelloServlet&lt;/servlet-class&gt; &lt;/servlet&gt; &lt;servlet-mapping&gt; &lt;servlet-name&gt;HelloServlet&lt;/servlet-name&gt; &lt;url-pattern&gt;/hello&lt;/url-pattern&gt; &lt;/servlet-mapping&gt; &lt;/web-app&gt; ``` 以上内容...

    Shopping-web-Jsp-Servlet.rar_java web servlet_shopping

    【标题】"Shopping-web-Jsp-Servlet.rar" 是一个基于Java Web技术的购物网站项目,主要涉及了JSP(JavaServer Pages)和Servlet的技术应用。这个项目可能是一个学生或者开发者为了学习或实践Web开发技能而创建的。在...

    java-web学习demo--最简单的servlet jsp跳转传值

    在Java Web开发中,Servlet和JSP是两个重要的组件,它们常常被用来构建动态Web应用程序。本示例"java-web学习demo--最简单的servlet jsp跳转传值"主要展示了如何通过Servlet处理HTTP请求,并将数据传递到JSP页面进行...

    Java EE WEB 工程师培训------JDBC+Servlet+JSP整合开发

    在这个领域,JDBC(Java Database Connectivity)、Servlet和JSP(JavaServer Pages)是基础且至关重要的技术,它们共同构成了Java Web开发的核心。 JDBC是Java中用于与数据库交互的API,它允许程序员用标准的Java...

    java-web -- servlet 拦截器 过滤器使用

    在Java Web开发中,Servlet、拦截器(Interceptor)和过滤器(Filter)是三个非常重要的概念,它们在处理HTTP请求和响应时起到了关键作用。理解并熟练运用这三者能够帮助开发者实现更高效、更安全的Web应用。 首先...

    7-Java-web开发17-Java-web开发17-Java-web开发17-Java-web开发17-Java-web开发

    4. **Java EE(Java Platform, Enterprise Edition)**: 也称为Java EE或Jakarta EE,是Java Web开发的基础框架,提供了一系列API和服务器环境,如Servlet、JSP、EJB(Enterprise JavaBeans)、JMS(Java Message ...

    JSP-Bean-Servlet.zip_java web servlet_java+web+servlet_jdp bean

    《深入理解Java Web开发:JSP、Bean与Servlet实战》 在Java企业级应用开发中,JSP(JavaServer Pages)、Bean和Servlet是构建Web应用程序的三大核心技术。本压缩包"JSP-Bean-Servlet.zip"包含了一个实际的Java Web...

    servlet-ppt java web相关servlet课件

    - `&lt;servlet&gt;`元素定义Servlet,`&lt;servlet-name&gt;`指定Servlet名称,`&lt;servlet-class&gt;`指定Servlet类全名。 - `&lt;servlet-mapping&gt;`元素将URL与Servlet关联,`&lt;url-pattern&gt;`指定匹配的URL模式。 4. **请求处理**:...

    Java-2.0:Java Servlet练习

    2. **Servlet配置**:在`web.xml`部署描述符中,我们可以通过`&lt;servlet&gt;`和`&lt;servlet-mapping&gt;`元素来配置Servlet。例如,定义Servlet类名、URL映射等。 3. **HttpServletRequest与HttpServletResponse接口**:这两...

    《Java Web开发技术大全--JSP+Servlet+Struts 2+Hibernate+Spring+AJAX》.(李宁).[PDF].&ckook;

    《Java Web开发技术大全--JSP+Servlet+Struts 2+Hibernate+Spring+AJAX》.(李宁),适合java web开发者,学生,老师,或者已经工作的。内容详细全面,高清

    Java-JSP-Servlet员工信息管理系统Mysql数据库+JSTL(可作为Java课设毕业设计)

    【Java-JSP-Servlet员工信息管理系统Mysql数据库+JSTL】是一个基于Java技术栈的Web应用程序,主要用于管理和处理员工信息。这个系统充分利用了Java的强大功能,结合了JSP(JavaServer Pages)、Servlet以及JSTL...

    HTTP-Proxy-Servlet:Smiley的HTTP代理实现为Java Servlet

    它是安全的-通过Java EE web.xml或通过Servlet过滤器(例如Spring-Security) 它是可扩展的-通过简单的类扩展 它是可嵌入的-到您的Java Web应用程序中,使测试应用程序更加容易 我已经看到许多以博客形式在网络上...

    java web Servlet

    "java web Servlet" Java Web Servlet 是一种基于 Java 语言的服务器小应用程序,主要用于处理客户端请求的响应处理。Servlet 是一个独立的平台,具有良好的性能和多线程运行能力。 Servlet 的主要特点是: * ...

    jetty servlet容器

    Jetty 是一个开源的servlet容器,它为基于Java的web容器,例如JSP和servlet提供运行环境。Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立...

    oop-java-servlet-Readdeo:oop-java-servlet-Readdeo由GitHub Classroom创建

    "oop-java-servlet-Readdeo:oop-java-servlet-Readdeo由GitHub Classroom创建" 这个标题表明这是一个关于面向对象编程(OOP)和Java Servlet技术的项目,它来源于GitHub Classroom,一个用于教学和学习的平台。...

    javax.servlet jar包---解决找不到javax.servlet.*等问题

    这个jar包是Java Servlet规范的一部分,用于构建动态、交互式的Web应用程序。当你遇到“找不到javax.servlet.*”这样的错误时,通常是因为你的项目缺少了这个库,所以需要引入`javax.servlet.jar`来解决问题。 1. *...

    servlet-api-3.0.zip

    这个"Servlet-API-3.0.zip"压缩包包含的是Servlet 3.0规范的API jar文件,该文件是开发和运行基于Java的Web应用程序所必需的库。以下是对Servlet API 3.0的详细讲解: 1. **Servlet 3.0引入的新特性**: - **注解...

Global site tag (gtag.js) - Google Analytics