1. 启动项目时如何实现不在链接里输入项目名就能启动?  

  修改Tomcat配置文件 server.xml。找到自己的项目配置 :

<Context docBase="oneProject" path="/one Project" reloadable="true" source="org.eclipse.jst.jee.server:userManager"/>

  改为如下配置:

<Context docBase="oneProject" path="/" reloadable="true" source="org.eclipse.jst.jee.server:userManager"/>

  经过这样的修改,项目就可以在启动服务器后不用输入项目访问了。

2.  1分钟之内只能处理1000个请求,你怎么实现,手撕代码?

  我知道的有两种方式可以实现:

    a). Application 对所有用户访问的次数计数。同时定义一个计时器,单位为一分钟。如果Application 中的用户在单位时间内超出请求次数,就拒绝处理该请求。一分钟再刷新application的值为0.

      使用一个Map 维护变量:

// 泛型 String 表示用户标识,List中存放用户不同请求的时间戳。
private Map<String, List<Long>> map = new ConcurrentHashMap<>();

    我们只需要在单位计数中判断 List中数量是否超出限制即可。

    b). 使用 aop 实现请求的限制,在需要限制的请求方法上加上 aop 逻辑。即可实现,思路如下:

      自定义注解类实现请求限制的拦截逻辑,在需要限制的方法上使用注解,超出限制后拒绝处理请求。

3. 什么时候用assert

  在开发和测试过程中,很多时候我们需要对某些场景进行判断,当这个判断满足我们预期的答案,才继续往下执行,否则提出程序或者发出警告。assert就是这样的功能,满足判断时返回true,否则返回false。但是真正到系统上线的时候,这些assert是不要使用的。

4.  java 应用服务器有哪些?

  Java 的应用服务器很多,从功能上分为两大类,JSP 服务器和 Java EE 服务器,也可分其他小类。相对来说 Java EE 服务器的功能更加强大。我平时就用Tomcat。

JSP 服务器有 Tomcat 、Bejy Tiger 、Geronimo 、 Jetty 、Jonas 、Jrun 、Orion 、Resin
Java EE 服务器有TongWeb 、BES Application Server 、 Apusic Application Server 、 IBM Websphere 、Sun Application Server 、Oracle 的 Oracle9i/AS 、Sun Java System Application Server 、Bea Weblogic 、JBoss、开源GlassFish。(来源自百度百科)
 
5. 说一说四种会话跟踪技术。
a).表单隐藏域
  

<input type="hidden" id="xxx" value="xxx">

在表单的提交中,加入这样一段数据提交的隐藏域,用户在输入时是看不到的,但是可以通过查看网页源代码来看到,在服务端只能通过post的方式获取参数。这种方式在禁用Cookie的情况下也能工作,但是关闭浏览器后就会失效。

b).URL重写
http://www.XXX.com/news?id=xxxx

在提交请求的URL后面加上请求需要的参数,常见的GET的请求。安全性能不高,参数可以在地址栏中看到,而且对于参数的长度有限制(1024字节),禁用Cookie的情况下也能使用,但是关闭浏览器后就会失效。

 
c).Cookie
    @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doGet(req, resp); // 新建一个Cookie
Cookie cookie = new Cookie("name", "pwd");
// 设置Cookie的生命周期
cookie.setMaxAge(Integer.MAX_VALUE);
// 将Cookie发送到客户端
resp.addCookie(cookie); // Cookie的修改,创建一个和已有的cookie同名,然后再添加到客户端,自动修改
Cookie secCookie = new Cookie("name", "newPwd");
resp.addCookie(secCookie); // cookie修改 // cookie的删除, 创建一个和已有的cookie同名,并设置maxAge为0,添加到客户端,就会自动删除
Cookie thirCookie = new Cookie("name", "thirPwd");
thirCookie.setMaxAge(0); // 修改生命周期为0
resp.addCookie(thirCookie); // 删除客户端cookie
}
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。 客户端浏览器会把Cookie保存起来,并由浏览器通过域名管理不同网站的Cookie。
 
除了以上的Cookie属性之外,还写一些常用的属性,可以根据实际的需求设置。
d).Session
Session代表服务器与浏览器的一次会话过程,这个过程是连续的,也可以时断时续的。在Servlet中,session指的是HttpSession类的对象。
  Session创建时间的误解:一般的误解是Session在客户端访问的时候就会被创建,但其实 Session 的真正创建时机是服务端程序调用 HttpServletRequest.getSession(true) . 我们知道JSP中有个内置对象是session,其实那是因为在我们编写的JSP代码中,默认有这么一句:HttpSession session = HttpServletRequest.getSession(true);在将JSP编译为Servlet代码的时候,Session就会被创建。但是Session会占用服务器的内存,因此我们不需要的时候,最好将该属性置false。  <% @page session=”false”%>。

  但客户端访问.html 等静态资源时,不涉及将JSP编译为Servlet,因此Session不会创建。当客户端第一次访问JSP页面时,服务器端将创建一个Session并保存在内存中,同时为客户端返回一个sessionID,以供客户端下次请求应用的时候带着sessionID来表明自己的身份。一次会话一个Session,Session通过sessionID来唯一标识。同时Session默认是在服务器的内存中维护的(虽然我们可以通过技术将session持久化),因此Session的长度不宜太大(虽然本身没有长度限制)。

  Session原理:因为http是无状态的连接,Session也不能根据连接来识别是否是同一次会话,因此客户端第一次请求JSP/Servlet之后,服务端会自动生成一个名叫JSESSIONID的Cookie,该Cookie的值就是sessionID,发送到客户端,客户端再次连接的时候,会自动带上这个JSESSIONID,找到相应的session。如果客户端端禁用了Cookie,那么这个JSESSIONID会通过URL重写发送到服务端。

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: max-age=0
Connection: keep-alive
Cookie: JSESSIONID=819B75C412FB029EDEF52B11484A642B
Host: localhost:8080
Referer: http://localhost:8080/market/
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36

  

  Session的生命周期:

  它的生命周期不累加的,而Cookie的生命周期是累加的,不累加的意思就是Session的计时是从最近一次访问开始的,而Cookie是从开始到结束,无论你期间是否使用。

    @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doGet(req, resp); // 真正的创建一个Session
HttpSession session = req.getSession(true);
// 设置Session的生命周期
session.setMaxInactiveInterval(Integer.MAX_VALUE);
  }

  Session相关的属性:

6. 讲讲Request对象的主要方法

序号  方法简述
1 Cookie[] getCookies()
返回一个数组,包含客户端发送该请求的所有的 Cookie 对象。
2 HttpSession getSession(boolean create)
返回与该请求关联的当前
HttpSession,或者如果没有当前会话,且创建是真的,则返回一个新的 session 会话。
3 Enumeration getParameterNames()
返回一个 String
对象的枚举,包含在该请求中包含的参数的名称。
4 Object getAttribute(String name)
以对象形式返回已命名属性的值,如果没有给定名称的属性存在,则返回 null。
5 String getCharacterEncoding()
返回请求主体中使用的字符编码的名称。
6 String getMethod()
返回请求的 HTTP 方法的名称,例如,GET、POST 或 PUT。
7 String getParameter(String name)
以字符串形式返回请求参数的值,或者如果参数不存在则返回
null。
8 String getRemoteHost()
返回发送请求的客户端的完全限定名称
9 String getRemoteAddr()
返回发送请求的客户端的互联网协议(IP)地址
10 String getRemoteHost()
返回发送请求的客户端的完全限定名称。

7.过滤器有哪些作用和用法?

过滤器的常见用途:

a).对用户的请求进行统一的认证、对访问的请求进行记录和审核

b).对用户传输的数据过滤和替换,转换图像格式,对响应内容进行压缩,减少网络传输

c).对用户的请求和响应进行加密处理

d).触发资源访问事件

Filter工作流程:

和 Filter相关的接口定义:

// 编写一个Filter需要 实现这个接口
public interface Filter { // 初始化Filter
public default void init(FilterConfig filterConfig) throws ServletException {} // Filter的逻辑实现,如果有多个Filter,必须在末尾执行 chain.doFilter(req, resp);
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException; // 过滤器的销毁过程,可用于关闭该过滤器中打开的资源
public default void destroy() {}
} // 当有多个过滤器连成一串的时候,知道真正的请求资源之前的一系列过滤
public interface FilterChain { public void doFilter(ServletRequest request, ServletResponse response)
throws IOException, ServletException; } // 过滤器的配置相关
// 做Filter初始化的时候,作为参数传入,初始化关于过滤器的配置
public interface FilterConfig { public String getFilterName(); public ServletContext getServletContext(); public String getInitParameter(String name); public Enumeration<String> getInitParameterNames(); }

注意事项: Filter 的执行顺序是在 web.xml 中定义的顺序,在多个Filter中的chain 中,一定在处理完当前Filter的逻辑之后,调用chain.doFilter(request, response) 转到下一个Filter

简单例子:

/**
* 实现字符编码过滤的过滤器
* @author ytuan
*
*/
public class FilterTest implements Filter { @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// TODO Auto-generated method stub HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response; req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8"); chain.doFilter(req, resp);
} }

8.请谈谈你对Javaweb开发中的监听器的理解?

监听器示意图:

JavaWeb中的监听器按照事件源分为三大类:作用范围由大而小

a).ServletContext (针对整个应用程序上下文)

b).HttpSession (针对单个用户会话)

c).ServletRequest (针对某一次ServletRequest )

针对这以上这三种不同作用域的对象,又把对象本身的事件类型分为三种:  

a).域对象自身的创建和销毁事件监听

b).域对象中属性的增删事件监听

c).监听绑定到HttpSession域中某个对象的状态事件监听

这里的对象创建和销毁包括三个,域对象中属性的增删包括ServletContext 和 ServletRequest 两个对象。需要重点注意一下HttpSession绑定的对象,它不同于前两者。

  保存在Session域中的对象可以有多种状态:绑定(session.setAttribute("bean",Object))到Session中;从 Session域中解除绑定(session.removeAttribute("bean"));随Session对象持久化到一个存储设备中;随Session对象从一个存储设备中恢复
  Servlet 规范中定义了两个特殊的监听器接口"HttpSessionBindingListener和HttpSessionActivationListener"来帮助JavaBean 对象了解自己在Session域中的这些状态: ,实现这两个接口的类不需要 web.xml 文件中进行注册

  a). HttpSessionBindingListener接口

    实现了HttpSessionBindingListener接口的JavaBean对象可以感知自己被绑定到Session中和 Session中删除的事件
    当对象被绑定到HttpSession对象中时,web服务器调用该对象的void valueBound(HttpSessionBindingEvent event)方法
    当对象从HttpSession对象中解除绑定时,web服务器调用该对象的void valueUnbound(HttpSessionBindingEvent event)方法

  b).HttpSessionActivationListener接口

    实现了HttpSessionActivationListener接口的JavaBean对象可以感知自己被活化(反序列化)和钝化(序列化)的事件
    当绑定到HttpSession对象中的javabean对象将要随HttpSession对象被钝化(序列化)之前,web服务器调用该javabean对象的void sessionWillPassivate(HttpSessionEvent event) 方法。这样javabean对象就可以知道自己将要和HttpSession对象一起被序列化(钝化)到硬盘中.
    当绑定到HttpSession对象中的javabean对象将要随HttpSession对象被活化(反序列化)之后,web服务器调用该javabean对象的void sessionDidActive(HttpSessionEvent event)方法。这样javabean对象就可以知道自己将要和 HttpSession对象一起被反序列化(活化)回到内存中  (此处参考:https://www.cnblogs.com/xdp-gacl/p/3969249.html

9.说说web.xml文件中可以配置哪些内容?

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<!-- 配置web引用程序中Servlet上下文的初始化参数 -->
<context-param>
<param-name>name</param-name>
<param-value>ytuan996</param-value>
</context-param> <!-- 当程序中发生错误时,跳转到哪一个页面。这里的错误可以是异常,也可以是错误码,但是只能是其中之一 -->
<error-page>
<exception-type></exception-type>
<error-code>500</error-code>
<location>error.jsp</location>
</error-page>
<!-- 配置自己定义的过滤器 -->
<filter>
<!-- 还可以在这里定义过滤器的自定义参数 -->
<init-param>
<param-name></param-name>
<param-value></param-value>
</init-param>
<filter-name></filter-name>
<filter-class></filter-class>
</filter> <!-- 过滤器的规则 -->
<filter-mapping>
<filter-name></filter-name>
<url-pattern></url-pattern>
</filter-mapping> <!-- 监听器 -->
<listener>
<listener-class></listener-class>
</listener> <!-- 配置Servlet -->
<servlet>
<servlet-name></servlet-name>
<servlet-class></servlet-class>
</servlet> <!-- 配置Servlet的请求路径 -->
<servlet-mapping>
<servlet-name></servlet-name>
<url-pattern></url-pattern>
</servlet-mapping> <!-- 配置访问应用的欢迎页面,一般是首页面 -->
<welcome-file-list>
<welcome-file></welcome-file>
</welcome-file-list> </web-app>

10.请谈谈JSP有哪些内置对象?作用分别是什么?

11.说一下表达式语言(EL)的隐式对象及其作用

12.JSP中的静态包含和动态包含有什么区别?

  

 
 
 
 

  

JavaWeb 基础面试的更多相关文章

  1. JavaWeb基础知识总结

    JavaWeb基础知识总结.   1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Internet上供 ...

  2. 超详细的Java面试题总结(四 )之JavaWeb基础知识总结

    系列文章请查看: 超详细的Java面试题总结(一)之Java基础知识篇 超详细的Java面试题总结(二)之Java基础知识篇 超详细的Java面试题总结(三)之Java集合篇常见问题 超详细的Java ...

  3. JAVA多线程和并发基础面试问答(转载)

    JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...

  4. JavaWeb基础: ServletContext

    基本概念 Web容器在启动时,会为每个Web应用程序都创建一个对应的ServletContext对象,它代表当前Web应用. ServletContext(javax.servlet.http.Ser ...

  5. [转] JAVA多线程和并发基础面试问答

    JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...

  6. JAVA多线程和并发基础面试问答

    转载: JAVA多线程和并发基础面试问答 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一.在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对 ...

  7. JavaWeb基础: 学习大纲

    JavaWeb基础: Web应用和Web服务器 JavaWeb基础: Tomcat JavaWeb基础:HTTP协议和基于Restful的架构 JavaWeb基础: Web工程配置文件 JavaWeb ...

  8. 【多线程】JAVA多线程和并发基础面试问答(转载)

    JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...

  9. Java---常用基础面试知识点

    综合网上的一点资源,给大家整理了一些Java常用的基础面试知识点,希望能帮助到刚开始学习或正在学习的学员. 1.抽象 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方 ...

随机推荐

  1. sklearn中的分词函数countVectorizer()的改动--保留长度为1的字符串

    1简述问题 使用countVectorizer()将文本向量化时发现,文本中长度唯一的字符串会被自动过滤掉,这对于我在做的情感分析来讲,一些表较重要的表达情感倾向的词汇被过滤掉,比如文本'没用的东西, ...

  2. Devexpress VCL Build v2013 vol 14.1.5 发布

    What's New in 14.1.5 (VCL Product Line)   New Major Features in 14.1 What's New in VCL Products 14.1 ...

  3. 2018.09.25 bzoj3572: [Hnoi2014]世界树(虚树+树形dp)

    传送门 虚树入门题? 好难啊. 在学习别人的写法之后终于过了. 这道题dp方程很好想. 主要是不好写. 简要说说思路吧. 显然最优值只能够从子树和父亲转移过来. 于是我们先dfs一遍用儿子更新父亲,然 ...

  4. 使用bat批处理文件备份mysql数据库

    @echo offset date_string=%date:~0,4%_%date:~5,2%_%date:~8,2%  //日期set time_string=%time:~0,2%_%time: ...

  5. 怎么备份VMware虚拟磁盘文件或移植到其他虚拟机

    原文:http://jingyan.baidu.com/article/a681b0de17b3173b1843468f.html 方法/步骤     第一种方法:直接复制本地主机磁盘下的虚拟磁盘文件 ...

  6. json&pickle

    用于序列化的两个模块 json,用于字符串 和 python数据类型间进行转换pickle,用于python特有的类型 和 python的数据类型间进行转换Json模块提供了四个功能:dumps.du ...

  7. UVa 11039 Building designing (贪心+排序+模拟)

    题意:给定n个非0绝对值不相同的数,让他们排成一列,符号交替但绝对值递增,求最长的序列长度. 析:我个去简单啊,也就是个水题.首先先把他们的绝对值按递增的顺序排序,然后呢,挨着扫一遍,只有符号不同才计 ...

  8. [unchecked] 对作 为原始类型Hashtable的成员的put(K,V)的调用未经过检查。。。

    问题: C:\Users\Administrator\Desktop\java\SoundApplet.java:212: 警告: [unchecked] 对作为原始类型Hashtable的成员的pu ...

  9. spring p 标签

    需要引入命名空间 xmlns:p="http://www.springframework.org/schema/p" p 是什么含义 p 是 property 的缩写,为了简化be ...

  10. 使用Revel(go)开发网站

    Revel很好的利用了Go语言的goroutine,把每一个request都分配到了goroutine里.不用再写一大堆的回调.如果你写过nodejs的话就会深刻的体会到callback hell是什 ...