Java Web后台入门实战(二)-YuaneQi Sharing

  上一篇博客Java Web后台入门实战(一)-YuaneQi Sharingjavax.servlet.http.HttpServlet类出发,一起过了类中的主要方法逻辑,介绍了http请求以及类中关联的状态码,并动手演示了”If-Modified-Since”“Last-Modified”实体头域的应用。

Eclipse中创建Java Web工程

  打开Eclipse,注意安装用于Web开发的Java EE版本的Eclipse,将下载好的Apache Tomcat® [Tomcat是一个轻量级免费开源的Servlet容器,能够运行我们的Java Web应用] 配置进来。File->New->Other。点击Server->next。相关工具大家也可以直接去我的百度网盘下载,Eclipse两个版本都可以用,zip是luna,exe是最新的neon,自己安装。

这里写图片描述

这里写图片描述

  选择相应的Tomcat版本->next,找到Tomcat安装路径,Finish,一个server就给配好了。

这里写图片描述

这里写图片描述

这里写图片描述

  接下来我们创建一个Java Dynamic Web Project。File->New->Dynamic Web Project,如若没找到Dynamic Web Project菜单,则File->New->other,在Wizards输入要搜索的项。在弹出的New Dynamic Web Project窗口输入你的Project name,一路next,在点击最后Finish按钮之前勾选Generate web.xml deployment discriptor。Servlet 3.0之后支持注解的配置方式,所以生成web.xml成为可选项,这里勾选上,我们一会儿会演示使用注解和xml文件两种方式配置Servlet。

这里写图片描述

这里写图片描述

这里写图片描述

  看下这个project的Web工程目录结构,就是下面这个WebContent文件夹,这个文件夹下对应着project部署到容器中时的上下文根路径,根目录,就是我们在浏览器输入根URL所访问的服务器地址,其他资源地址都是相对于这个地址的相对路径。

这里写图片描述

  再来看下这个project部署到容器中时,它的目录结构。在这个project上右键->Run As->Run on Server。根据这个路径找到eclipse中运行的tomcat的发布文件夹%you eclipse workplace%\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps

这里写图片描述

  找到我们的project目录,进去后发现其下内容与eclipse中project的WebContent下的内容完全一样,验证了我们之前的说法,小伙伴想问why?回到Eclipse中,project上右键->Properties,找到Deployment Assembly项,Deployment Assembly项为web工程指定在发布的时候要部署到容器中的部件。我们看到WebContent文件夹对应的就是部署后的项目的上下文根路径,就这么个原因。

这里写图片描述

  我们可以更改这个目录为我们想要的目录,将Deployment Assembly中的WebContent Remove,新创建一个webapp目录,并照着WebContent目录下的文件,文件夹新建一份,之后把它配置为Deploy Path。此时我们的项目结构是这样的:

这里写图片描述

这里写图片描述

  我又新加了一个index.jsp,内容很简单,显示”hello world!”,运行一下,成功,完全是自己掌控。

这里写图片描述

  对于使用Eclipse的初学者来说,知道这个相当重要,比如当使用maven spring的时候,我们的项目第一次运行后可能会起不起来,出现第三方库的ClassNotFoundException,这个时候一般去检查Deployment Assembly中是否将Maven Dependencies库加到了WEB-INF/lib下面,很快就解决了。
  回过头看下WebContent目录下的内容,META-INF,看名字就能明白,存放一些meta information,这个目录下的文件应该都是build工具来生成的。WEB-INF是一个特殊的文件夹,容器会保护此文件下的内容不被浏览器访问,就是说我们直接在浏览器通过URL的方式是访问不到的,所以我们一般会将图片文件夹,JS,CSS文件夹,以及我们的JSP页面放到WEB项目的根目录下,而将配置文件放到WEB-INF下面。WEB-INF的lib文件夹存放本应用所依赖的第三方包。
  web.xml文件用来配置Web应用的组件。我们自己的Servlet要在文件中配置后才能访问,不过Servlet 3.0之后也可以不用配置文件而直接使用注解的方式配置servlet,两种方式各有利弊,注解散落在个各类中,不好管理,而使用配置文件都集中在一处配置,一目了然,但是随着内容的增加会略显臃肿。<welcome-file-list/>元素配置Web应用的首页列表。默认生成的配置信息指定该Web应用的首页依次是index.html,index.htm,index.jsp等,当index.html不存在的时候,则由index.htm页面来充当首页,以此类推,当容器没有找到<welcome-file-list/>中的页面时,我们会看到404 error report,不要被这种页面吓到,很好解决,要么检查你的URL路径是否正确,要么新建一个URL所请求的资源,这里我们重写一个首页文件就OK了。

Servlet创建

  在src文件加上右键->New->Class->输入Class Name->点击Browse->搜索HttpServlet->点击OK->点击Finish,一个HttpServlet类就创建完成了。

这里写图片描述

  使用注解的方式配置Servlet,只需要在我们创建的类上加上注解@WebServlet(urlPatterns = ("you path"))即可,直接运行,页面显示405状态码,HttpServlet中doGet方法的默认实现,这就OK了,你也可以重写doGet方法,加入自己的处理逻辑。

这里写图片描述

  使用文件配置的方式,打开web.xml,加入如下配置即可:

 <servlet>
    <servlet-name>exampleOne</servlet-name>
    <servlet-class>example.ExampleTwoServlet</servlet-class>
 </servlet>

 <servlet-mapping>
    <servlet-name>exampleOne</servlet-name>
    <url-pattern>/example/two</url-pattern>
 </servlet-mapping>

  <servlet>配置Servlet基本信息,<servlet-name>的值可以配置成任何你喜欢的名字,只要和<servlet-mapping>中的name前后对应上就行,<servlet-class>指定Servlet类的完全限定名。<servlet-mapping>配置Servlet的URL路径,<url-pattern>指定Servlet的URL路径。

Tomcat自带Examples

  这一节的目的是通过Tomcat中的Examples了解相关类的应用。点击Examples出现404,是因为安装Tomcat时没有勾选examples的选项,examples和host-manager一样,是Tomcat自己写的web应用而已,同样部署在Tomcat中,我们在%CATALINA_HOME%\webapps下都能找到,同样的也可以从别的途径获得examples代码,放到webapps下面就可以访问了。

这里写图片描述

  Servlets examples、JSP Examples、WebSocket Examples,我们只过了Servlets examples,例子都很适合初学者阅读。我把源码中从上到下涉及到的所有类及方法总结出来,自己对照着去看代码。

这里写图片描述

ResourceBundle(能够方便读取.properties配置文件)

方法描述
ResourceBundle.getBundle(String baseName, Locale locale)返回具有给定基本名称和语言环境的ResourceBundle对象
String getString(String key)从此ResourceBundle资源包中获取给定键的字符串

HttpServletRequest(获取请求头和请求参数)

方法描述
Locale getLocale()获取客户端所使用的本地语言
String getMethod()返回http请求的方法名称
String getRequestURI()a String containing the part of the URL from the protocol name up to the query string ()
String getProtocol()返回协议名称和协议版本号
String getMethod()返回http请求的方法名称
String getPathInfo()返回请求URL中Servlet路径之后查询字符串之前的额外路径信息。如果没有额外路径信息,返回null
String getRemoteAddr()获取发送请求的客户端的IP地址
Object getAttribute(String name)获取指定属性的属性值
Enumeration<String> getHeaderNames()获取所有请求参数的名称
String getHeader(String name)获取指定请求头的值
String getParameter(String name)获取请求参数的值
Cookie[] getCookies()获取本次请求携带地所有cookies
HttpSession getSession(boolean create)返回与当前请求相关联的HttpSession对象,create为true时,如果当前会话无效,则创建,否则返回null

  Servlet 3.1 API文档对String getRequestURI()方法的描述是a String containing the part of the URL from the protocol name up to the query string (),翻译过来是URL中的协议之后到查询字符串之前的部分,但实际上得到是域名之后到查询字符串的部分,理解有出入,故不敢随便翻译。看下它的底层实现return request.getServletContext();,实际是就是获取了ServletContextPath。
  String getPathInfo()方法返回请求URL中Servlet路径之后查询字符串之前的额外路径信息。如果没有额外路径信息,返回null。查询字符串,客户端发起的GET请求如果携带参数,如http://localhost:8088/examples/servlets/servlet/RequestInfoExample?param1=value1&param2=value2,的形式?号后面的字符串会被解析为查询字符串,格式一般是?param1=value1&param2=value2。而String getPathInfo()返回servlet path和查询字符串之间的路径,如http://localhost:8088/examples/servlets/servlet/RequestInfoExample/user/xiaoming?param1=value1&param2=value2,我们配置的servlet path是/servlets/servlet/RequestInfoExample,那么extra path就是/user/xiaoming,不要搞混了。

HttpServletResponse(代表服务器对客户端的响应)

方法描述
void setContentType(String type)设置发送到客户端的响应的内容类型
void setCharacterEncoding(String charset)设置发送到客户端的响应的字符编码(MIME字符集),例如,设置为UTF-8
PrintWriter getWriter()获取页面输出流
void addCookie(Cookie cookie)设置cookie

Cookie(浏览器端跟踪用户会话状态)

方法描述
String getName()获取cookie的名字
String getValue()获取cookie的值

HttpSession(服务器端跟踪用户会话状态)

方法描述
long getCreationTime()获取session的创建时间
long getLastAccessedTime()获取上一次访问当前会话session的时间
String getId()获取当前会话ID
void setAttribute(String name, Object value)设置session范围内属性
Enumeration<String>getAttributeNames()获取所有属性的名字
Object getAttribute(String name)获取指定属性名的value

  Session和cookie区别(摘自网络):

  1. 都是用来跟踪用户的会话状态,cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案
  2. cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session
  3. session是Java对象,会在一定时间内保存在服务器上,当访问增多,会比较占用服务器内存
  4. 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

Template Pattern

  In Template pattern, an abstract class exposes defined way(s)/template(s) to execute its methods. Its subclasses can override the method implementation as per need but the invocation is to be in the same way as defined by an abstract class. This pattern comes under behavior pattern category.[在模板模式中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。]

这里写图片描述

  在Servlet中,模板方法由service()方法担任,子类按需重写do method 方法,不过需要注意一点,更多时候我们会将Template Method定义为final方法,防止子类重写父类模板。


总结下这次分享中所有涉及到可能会被问的面试题

  • 抽象类和接口的区别(HttpServlet is an abstract class)
  • override和overload区别(HttpServlet中两个service方法重载,子类按需重写HttpServlet中的方法)
  • POST请求和GET请求的区别
  • http协议中请求行和状态行的格式(请求行:请求方式 资源路径 HTTP版本<CRLF>;状态行:HTTP版本 状态码 描述<CRLF>,开发者工具中可观察)
  • session和cookie的区别
  • 做项目时用到过哪些设计模式(Template Pattern)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值