Java Web 上机面试题及详细答案(实操版)_第1页
Java Web 上机面试题及详细答案(实操版)_第2页
Java Web 上机面试题及详细答案(实操版)_第3页
Java Web 上机面试题及详细答案(实操版)_第4页
Java Web 上机面试题及详细答案(实操版)_第5页
已阅读5页,还剩5页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JavaWeb上机面试题及详细答案(实操版)说明:本套试题为企业真实上机面试常用题型,涵盖Servlet、JSP、Filter、MVC、JDBC、请求处理、异常排查等核心实操考点,题型分为基础问答实操、代码纠错、编程实操、场景应用题,全程贴合开发实际工作场景。一、基础实操问答题(共5题,侧重上机实操原理排查)1.简述Servlet的生命周期,以及每个阶段对应的方法和执行时机详细答案:Servlet生命周期分为三个核心阶段,全程由Tomcat容器管理,开发者仅需重写对应方法实现业务:1.初始化阶段:服务器启动或首次访问该Servlet时触发,仅执行一次。容器调用init()方法,主要用于加载配置、初始化连接池、读取全局参数等一次性操作。2.服务处理阶段:每次客户端发起请求都会触发,可执行多次。容器调用service()方法,内部根据请求方式分发doGet()、doPost()方法,处理具体请求响应逻辑。3.销毁阶段:服务器关闭、项目卸载或Servlet超时销毁时触发,仅执行一次。容器调用destroy()方法,用于释放资源,比如关闭连接、清空缓存、销毁线程等。2.GET和POST请求的核心区别,上机开发中分别适用什么场景?详细答案:1.参数传递:GET参数拼接在URL后面,POST参数放在请求体中;2.数据限制:GET有长度限制,无法传输大数据;POST无长度限制,可传文件、长文本;3.缓存特性:GET请求会被浏览器缓存,刷新、回退无影响;POST不会缓存,重复提交会重复执行业务;4.安全性:GET参数暴露在地址栏,安全性低;POST参数隐藏,相对安全;实操场景:查询数据、分页、条件筛选用GET;新增、修改、删除数据、文件上传、提交表单用POST。3.JSP中4大作用域的优先级和生命周期,以及实际开发使用场景详细答案:作用域范围从小到大:page<request<session<application1.pageContext(页面作用域):仅当前页面有效,页面跳转后数据失效,用于当前页临时数据展示;2.request(请求作用域):一次请求有效,服务端跳转(forward)数据保留,客户端重定向(redirect)数据失效,常用于单次请求的查询结果传递;3.session(会话作用域):单次浏览器会话有效,关闭浏览器或会话超时后失效,用于存储用户登录信息、购物车临时数据;4.application(全局作用域):整个项目运行期间有效,所有用户共享,用于存储项目全局配置、网站访问量统计。4.Filter过滤器的执行原理,以及和Servlet的区别详细答案:Filter是JavaWeb的拦截器,运行在Servlet之前,属于请求预处理、后处理组件。客户端请求先经过Filter,拦截通过后才会进入Servlet处理业务,响应数据也会先经过Filter再返回客户端。核心区别:1.作用不同:Filter负责全局拦截、权限校验、编码过滤、跨域处理;Servlet负责具体业务请求处理、数据响应;2.执行顺序:请求先过Filter,再进Servlet;3.粒度不同:Filter可拦截所有请求或指定路径请求;Servlet只处理自身匹配路径的请求。5.简述forward(服务器跳转)和redirect(客户端重定向)的区别详细答案:1.跳转主体:forward是服务端内部跳转,浏览器无感知;redirect是客户端跳转,服务器返回302状态码,浏览器重新发起新请求;2.地址栏变化:forward地址栏URL不变;redirect地址栏变为跳转后的地址;3.数据保留:forward保留request作用域数据;redirect丢失request数据;4.跳转范围:forward只能跳转到项目内部资源;redirect可跳转外网地址、项目外资源;5.请求次数:forward一次请求;redirect两次请求。二、代码纠错题(上机高频考点,找出错误并修正)题目1:Servlet接收POST请求中文乱码问题代码纠错错误代码:java

protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{

Stringusername=request.getParameter("username");

Stringpassword=request.getParameter("password");

response.getWriter().write("登录成功");

}错误分析及修正答案:存在两处核心错误:1.POST请求参数未设置请求编码,会导致中文参数乱码;2.响应数据未设置响应编码,前端页面展示中文乱码。修正后代码:java

protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{

//设置请求编码,解决POST参数中文乱码

request.setCharacterEncoding("UTF-8");

//设置响应编码和页面解析格式

response.setContentType("text/html;charset=UTF-8");

Stringusername=request.getParameter("username");

Stringpassword=request.getParameter("password");

response.getWriter().write("登录成功");

}题目2:JDBC查询数据资源未释放代码纠错错误代码(存在资源泄露):java

publicUsergetUserById(intid)throwsSQLException{

Connectionconn=JDBCUtil.getConnection();

Stringsql="select*fromuserwhereid=?";

PreparedStatementpstmt=conn.prepareStatement(sql);

pstmt.setInt(1,id);

ResultSetrs=pstmt.executeQuery();

Useruser=null;

if(rs.next()){

user=newUser();

user.setId(rs.getInt("id"));

user.setUsername(rs.getString("username"));

}

returnuser;

}错误分析及修正答案:核心错误:数据库连接、语句对象、结果集未手动关闭,会造成数据库连接池资源耗尽,项目卡顿崩溃。且未使用try-finally保证资源一定释放。修正后代码:java

publicUsergetUserById(intid){

Connectionconn=null;

PreparedStatementpstmt=null;

ResultSetrs=null;

Useruser=null;

try{

conn=JDBCUtil.getConnection();

Stringsql="select*fromuserwhereid=?";

pstmt=conn.prepareStatement(sql);

pstmt.setInt(1,id);

rs=pstmt.executeQuery();

if(rs.next()){

user=newUser();

user.setId(rs.getInt("id"));

user.setUsername(rs.getString("username"));

}

}catch(SQLExceptione){

e.printStackTrace();

}finally{

//逐级关闭资源

JDBCUtil.close(rs,pstmt,conn);

}

returnuser;

}三、编程实操题(上机必写核心代码)题目1:编写一个登录Servlet,实现账号密码校验、登录成功存入session、失败跳转登录页需求说明:1.接收前端username、password参数;2.校验参数非空;3.模拟数据库校验账号密码(admin/123456);4.登录成功:将用户信息存入session,转发到首页;5.登录失败:转发到登录页,提示错误信息。完整参考答案:java

importjavax.servlet.ServletException;

importjavax.servlet.annotation.WebServlet;

importjavax.servlet.http.HttpServlet;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

importjavax.servlet.http.HttpSession;

importjava.io.IOException;

@WebServlet("/login")

publicclassLoginServletextendsHttpServlet{

@Override

protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{

//统一编码

request.setCharacterEncoding("UTF-8");

response.setContentType("text/html;charset=UTF-8");

//1.获取参数

Stringusername=request.getParameter("username");

Stringpassword=request.getParameter("password");

//2.非空校验

if(username==null||"".equals(username.trim())||password==null||"".equals(password.trim())){

request.setAttribute("msg","账号密码不能为空!");

request.getRequestDispatcher("/login.jsp").forward(request,response);

return;

}

//3.业务校验(模拟数据库查询)

if("admin".equals(username)&&"123456".equals(password)){

//登录成功,存入session

HttpSessionsession=request.getSession();

session.setAttribute("username",username);

//跳转到首页

request.getRequestDispatcher("/index.jsp").forward(request,response);

}else{

//登录失败

request.setAttribute("msg","账号或密码错误!");

request.getRequestDispatcher("/login.jsp").forward(request,response);

}

}

@Override

protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{

doPost(request,response);

}

}题目2:编写编码过滤器,解决全局中文乱码问题需求说明:拦截所有请求,统一设置UTF-8编码,解决GET/POST全局乱码完整参考答案:java

importjavax.servlet.*;

importjavax.servlet.annotation.WebFilter;

importjava.io.IOException;

//拦截所有请求

@WebFilter("/*")

publicclassEncodingFilterimplementsFilter{

@Override

publicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainfilterChain)throwsIOException,ServletException{

//统一请求编码

servletRequest.setCharacterEncoding("UTF-8");

//统一响应编码

servletResponse.setContentType("text/html;charset=UTF-8");

//放行请求

filterChain.doFilter(servletRequest,servletResponse);

}

@Override

publicvoidinit(FilterConfigfilterConfig)throwsServletException{}

@Override

publicvoiddestroy(){}

}题目3:基于MVC模式实现用户查询功能(Servlet+JSP+JavaBean)需求:通过id查询用户,Servlet处理业务,JavaBean封装数据,JSP展示数据1.实体类User.javajava

publicclassUser{

privateIntegerid;

privateStringusername;

privateStringphone;

//无参、有参构造

publicUser(){}

publicUser(Integerid,Stringusername,Stringphone){

this.id=id;

this.username=username;

this.phone=phone;

}

//getter、setter

publicIntegergetId(){returnid;}

publicvoidsetId(Integerid){this.id=id;}

publicStringgetUsername(){returnusername;}

publicvoidsetUsername(Stringusername){this.username=username;}

publicStringgetPhone(){returnphone;}

publicvoidsetPhone(Stringphone){this.phone=phone;}

}2.UserServlet业务处理java

importjavax.servlet.ServletException;

importjavax.servlet.annotation.WebServlet;

importjavax.servlet.http.HttpServlet;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

importjava.io.IOException;

@WebServlet("/getUser")

publicclassUserServletextendsHttpServlet{

@Override

protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{

request.setCharacterEncoding("UTF-8");

//获取参数

Stringuid=request.getParameter("id");

intid=Integer.parseInt(uid);

//模拟数据库查询

Useruser=null;

if(id==1){

user=newUser(1,"张三",);

}

//数据存入request域

request.setAttribute("user",user);

//转发到展示页面

request.getRequestDispatcher("/user.jsp").forward(request,response);

}

@Override

protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{

doGet(request,response);

}

}3.user.jsp展示页面jsp

<%@pagecontentType="text/html;charset=UTF-8"language="java"%>

<%@pageimport="com.entity.User"%>

<html>

<head>

<title>用户信息</title>

</head>

<bod

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论