1、forward与redirect区别,说一下你知道的状态码,redirect的状态码是多少?
状态码 | 说明 |
200 | 客户端请求成功 |
302 | 请求重定向,也是临时跳转,跳转的地址通过Location指定 |
400 | 客户端请求有语法错误,不能被服务器识别 |
403 | 服务器收到请求,但是拒绝提供服务 |
404 | 请求的资源不存在 |
500 | 服务器发生不可预期的错误 |
503 | 由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。如果能够预计延迟时间,那么响应中可以包含一个Retry-After起头用以标明这个延迟时间。如果没有给出这个Retry-After信息,那么客户端应当以处理500(Server Internal Error)响应的方式处理它。注意:503状态码的存在并不意味着必须在服务器过载的时候使用它。某些服务器只不过是希望拒绝某些客户端的连接。 |
forward和redirect 都是用于信息资源之间的相互转发,不过他们是两种不同的转发法方式。
a).forward:直接转发方式,客户端或者浏览器只发送一次请求,Servlet把请求转发给Servlet、HTML、JSP或其它信息资源,由第2个信息资源响应该请求,两个信息资源共享同一个request对象。
在Servlet编程中,使用接口RequestDispatcher的forward(ServletRequest, ServletResponse)方法,同时还有另外一个方法是include(ServletRequest request, ServletResponse response),用于包含另一个Servlet的资源;定义如下:
public interface RequestDispatcher { // Forwards a request from a servlet to another resource (servlet, JSP file,or HTML file) on the server. public void forward(ServletRequest request, ServletResponse response) throws ServletException, IOException; // Includes the content of a resource (servlet, JSP page, HTML file) in the response. public void include(ServletRequest request, ServletResponse response) throws ServletException, IOException; }
RequestDispatcher 中两种方法的区别
b).redirect:间接转发方式,服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的。它本质上是两次HTTP请求,对应两个request对象。状态码是302.
在Servlet编程中,使用 HttpServletResponse 的 sendRedirect 方法,
public interface HttpServletResponse extends ServletResponse { // Sends a temporary redirect response to the client using the specified redirect location URL. public void sendRedirect(String location) throws IOException; }
2、servlet生命周期,是否单例,为什么是单例。
Servlet并不是单例,只是容器让它只实例化一次,变现出来的是单例的效果而已。
(1)加载和实例化
当Servlet容器启动或客户端发送一个请求时,Servlet容器会查找内存中是否存在该Servlet实例,若存在,则直接读取该实例响应请求;如果不存在,就创建一个Servlet实例。
(2) 初始化
实例化后,Servlet容器将调用Servlet的init()方法进行初始化(一些准备工作或资源预加载工作)。
(3)服务
初始化后,Servlet处于能响应请求的就绪状态。当接收到客户端请求时,调用service()的方法处理客户端请求,HttpServlet的service()方法会根据不同的请求 转调不同的doXxx()方法。
(4)销毁
当Servlet容器关闭时,Servlet实例也随时销毁。其间,Servlet容器会调用Servlet 的destroy()方法去判断该Servlet是否应当被释放(或回收资源)。
3、说出Servlet的生命周期,并说出Servlet和CGI的区别。
4、Servlet执行时一般实现哪几个方法?
- public void init(ServletConfig config) throws ServletException;
- public ServletConfig getServletConfig();
- public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
- public String getServletInfo();
- public void destroy();
public interface Servlet { /** * Called by the servlet container to indicate to a servlet that the servlet * is being placed into service. * */ public void init(ServletConfig config) throws ServletException; /** * * Returns a {@link ServletConfig} object, which contains initialization and * startup parameters for this servlet. The <code>ServletConfig</code> * object returned is the one passed to the <code>init</code> method. * * @return the <code>ServletConfig</code> object that initializes this * servlet * * @see #init */ public ServletConfig getServletConfig(); /** * Called by the servlet container to allow the servlet to respond to a * request. * * <p> * This method is only called after the servlet's <code>init()</code> method * has completed successfully. */ public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException; /** * Returns information about the servlet, such as author, version, and * copyright. * */ public String getServletInfo(); /** * Called by the servlet container to indicate to a servlet that the servlet * is being taken out of service. This method is only called once all * threads within the servlet's <code>service</code> method have exited or * after a timeout period has passed. After the servlet container calls this * method, it will not call the <code>service</code> method again on this * servlet. */ public void destroy(); }
5、阐述一下阐述Servlet和CGI的区别?
Servlet 线程处理请求,CGI 对每个请求创建进程。
6、说说Servlet接口中有哪些方法?
public interface Servlet { /** * Called by the servlet container to indicate to a servlet that the servlet * is being placed into service. * */ public void init(ServletConfig config) throws ServletException; /** * * Returns a {@link ServletConfig} object, which contains initialization and * startup parameters for this servlet. The <code>ServletConfig</code> * object returned is the one passed to the <code>init</code> method. * * @return the <code>ServletConfig</code> object that initializes this * servlet * * @see #init */ public ServletConfig getServletConfig(); /** * Called by the servlet container to allow the servlet to respond to a * request. * * <p> * This method is only called after the servlet's <code>init()</code> method * has completed successfully. */ public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException; /** * Returns information about the servlet, such as author, version, and * copyright. * */ public String getServletInfo(); /** * Called by the servlet container to indicate to a servlet that the servlet * is being taken out of service. This method is only called once all * threads within the servlet's <code>service</code> method have exited or * after a timeout period has passed. After the servlet container calls this * method, it will not call the <code>service</code> method again on this * servlet. */ public void destroy(); }
7、Servlet 3中的异步处理指的是什么?
参考地址: https://www.cnblogs.com/davenkin/p/async-servlet.html
异步处理调用示例:
@WebServlet(urlPatterns = {"/async"}, asyncSupported = true) public class AsyncServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 开启Tomcat异步Servlet支持 req.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true); final AsyncContext ctx = req.startAsync(); // 启动异步处理的上下文 // ctx.setTimeout(30000); ctx.start(new Runnable() { @Override public void run() { // 在此处添加异步处理的代码 ctx.complete(); } }); } }
8、如何在基于Java的Web项目中实现文件上传和下载?
传统方式:在Servlet中并没有提供文件上传、下载的API,因此我们一般都引入三方组件实现功能,推荐Apache的commons-fileupload,commons-io。
具体做法是 在前端代码中将需要上传文件的表单类型设置为 enctype="multipart/form-data" ,选择文件的组件为 <input type="file" name="file1">,在Servlet中 使用 Apache 包中的组件接收文件。
Servlet3:在Servlet3中异常简单,前端还是不变,但是接收文件的Servlet只需要加上注解 @MultipartConfig 即可,然后调用 request.getParts() 即可获取所有文件上传的组件并接收文件。
示例参考:
<form action="UploadServlet" method="post" enctype="multipart/form-data"> Photo file: <input type="file" name="file" /> <input type="submit" value="Upload" /> </form>
// @MultipartConfig 常用属性maxFileSize单个文件大小,location 文件的临时保存位置,maxRequestSize 文件上传最大请求数 @MultipartConfig(maxFileSize=1000,location = "filePath",maxRequestSize= 2) @WebServlet("/uploadFile") public class UploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=UTF-8"); PrintWriter out = resp.getWriter(); String path = this.getServletContext().getRealPath("/savePath"); // 可以用request.getPart()方法获得名为photo的上传附件 // 也可以用request.getParts()获得所有上传附件(多文件上传) // 然后通过循环分别处理每一个上传的文件 Part part = req.getPart("file"); if (part.getSubmittedFileName() != null) { String fileName = part.getSubmittedFileName(); part.write(path + "/" + fileName); out.write("上传文件成功"); } else { out.write("上传文件失败"); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } }
9、服务器收到用户提交的表单数据,到底是调用Servlet的doGet()还是doPost()方法?
表单提交的方式是 post 方式,因此经过Servlet的service() 方法处理后,将调用doPost() 方法。
10、Servlet中如何获取用户提交的查询参数或表单数据?
在ServletRequest 接口中定义了若干方法接收用户的查询参数。常用的方法有:
public String getParameter(String name);
public Enumeration<String> getParameterNames();
public String[] getParameterValues(String name);
public Map<String, String[]> getParameterMap();
11、Servlet中如何获取用户配置的初始化参数以及服务器上下文参数?
// 获取服务器上文的参数
req.getServletContext().getAttribute("sttributeName");
// 获取用户配置的参数
req.getServletContext().getInitParameter("paramName");
12、讲一下redis的主从复制怎么做的?
13、redis为什么读写速率快性能好?
14、redis为什么是单线程?
15、缓存的优点?
16、aof,rdb,优点,区别?
17、redis的List能用做什么场景?
18、说说MVC的各个部分都有那些技术来实现?如何实现?
M:mode,数据模型层,主要负责系统分层中对数据的操作部分,基于DAO模式,我知道的有MyBatis,Hibernate。
V:view,视图解析层,业务逻辑将数据处理完成后,需要展示给前端用户。Jsp, theamleaf
C:controller,请求控制层,针对用户的每个业务请求,都有相应的方法或者Servlet进行处理,通过调用业务逻辑处理和数据操作,返回给用户一个展示数据的页面。SpringMVC,Struts
此外还有具体的业务逻辑处理层,使用Spring Ioc 和 aop 处理对象之间的依赖关系和逻辑。
19、什么是DAO模式?
Data Access Object,主要实现了对数据持久化的操作(数据库的CRUD),DAO模式则是人们大量实践的经验总结,约定俗成,DAO组成主要有:
Database Connection: 数据库的连接和关闭的响应操作。
Pojo :主要是对象的属性,setter/getter方法,这样的每一个pojo对象对应了数据库中的一条记录
Dao: 对数据库操作的接口方法定义,包括CRUD操作;
DaoImpl: 对Dao接口定义的具体实现,粒度为每张的表的各种CRUD操作,包括批量,单个,联表操作等。但是不实现数据库的连接和关闭。
Proxy: 代理类,负责数据库的连接和关闭。
Factory:获取一个DAO对象完成对数据库的相应操作。
20、请问Java Web开发的Model 1和Model 2分别指的是什么?
参考地址: https://www.breakyizhan.com/javamianshiti/2591.html
Model 1是以页面为中心的Java Web开发,使用JSP+JavaBean技术将页面显示逻辑和业务逻辑处理分开,JSP实现页面显示,JavaBean对象用来保存数据和实现业务逻辑。Model 2是基于MVC(模型-视图-控制器,Model-View-Controller)架构模式的开发模型,实现了模型和视图的彻底分离,利于团队开发和代码复用,如下图所示:
21、你的项目中使用过哪些JSTL标签?
22、使用标签库有什么好处?如何自定义JSP标签?(JSP标签)