一、单项选择题
1.安装 tomcat 成功后,如要修改 tomcat 端口,要修改的文件是( )。
A.tomcat/bin/startup.bat 文件
B.tomcat/conf/server.xml
C.tomcat/conf/web.xml
D.以上都不
选B
解析:
A.tomcat/bin/startup.bat 文件:
这个文件是用来启动 Tomcat 的脚本文件。它根本不会包含 Tomcat 端口配置。
C.tomcat/conf/web.xml:
这个文件是 Tomcat 的全局 Web 应用程序部署描述符。它用于定义全局的 servlet 和过滤器映射等配置,你写Servlet的时候肯定用过。
D.排除
B.tomcat/conf/server.xml:
这是 Tomcat 的主要配置文件,其中包括连接器的配置。要修改 Tomcat 的端口号,需要在
server.xml
文件中找到
<Connector>
元素并修改其
port
属性。示例:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!--要修改端口号,只需将 port 属性的值从 8080 改为所需的端口号,例如:-->
<Connector port="9090" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
2.Java Web 开发服务端程序所需具备的技能不包括( )。
A.JSP
B.CSS
C.Servlet
D.JDBC
选B
解析:开发服务端(后端)要什么CSS,那是前端的(客户端);
3.需要在 JSP 页面中引入 java.util.*包,需要用到的指令是( )。
A.
<%@page import="java.util.*" %>
B.
<%@taglib import="java.util.*" %
C.
<%@page package="java.util.*" %>
D.
<%@include import="java.util.*" %>
直接选A
解析:taglib是导入标签库的,不管;page没错,但是package这东西就不该出现在这里,排除;include是来包含其他界面文件的,一样排除。
4.阅读下列 JSP 代码片断: 其运行结果是( )。
<% int x=5; %>
<%! private int m(int a){ return a+1;} %>
<% x=3; %>
x=<%=x%>,<%=m(x)%>
A.x=3,6
B.x=3,4
C.x=5,4
D.编译错误
选B秒了
解析:
int x = 5;
:声明局部变量
x
并赋值为 5。
private int m(int a) { return a + 1; }
:声明了一个方法
m
,它返回
a + 1
。
x = 3;
:将局部变量
x
的值更新为 3。
x=<%= x %>
:输出
x
的当前值,即 3。
<%= m(x) %>
:调用方法
m
,传入当前
x
的值(3),因此
m(x)
的结果是 4。
5.在 c_if.jsp 有如下部分代码
<c:if test="true" >
true
</c:if>
对于上述代码片段说法正确的是( )。
A.该页面代码部署启动时,控制台会报错
B.在该页面会出现编译错误,并有红叉提示
C.访问该页面会出现结果:true
D.访问该页面时,浏览器没有任何信息显示
选C
解析:这道题我其实是靠排除法来的:
A、这个选项不太准确。在 JSP 页面中使用 JSTL 标签,如果标签库配置正确,一般不会在部署时报错,而是在运行时出现问题才会在控制台显示相关信息
B、如果标签库没有正确引入或配置,可能会有红叉提示或相关的标签解析错误提示。但显然没有这个先决条件,先怀疑一手
C、这是比较符合实际情况的选项。如果
<c:if>
的
test
属性的值为 true,那么其中的内容 "true" 将会在页面上输出或展示。
D、也就是C选项反面,但我们已经认同C是正确的了,那就排除D
6.下面关于 EL 表达式${(1==2)?3:4}的运算结果,正确的是( )。
A.True
B.false
C.3
D.4
选D
解析:没什么好说的,就是三目运算符,成立就是?后的元素,反之取:后的元素
7.下列选项,可用于存储结果集的对象是( )。
A.ResultSet
B.Connection
C.Statement
D.PreparedStatement
选A呀
解析:B是你拿来连接数据库的;C是你来跑sql语句的,D也是跑sql语句的,没道理选它们
8.下面选项中,用于创建将参数化的 SQL 语句发送到数据库的对象方法是( )。
A.prepareCall(String sql)
B.prepareStatement(String sql)
C.registerDriver(Driver driver)
D.createStatement()
选B
解析:看题干,让你参数化sql,什么是参数化?简单来说就是防止SQL注入的一种手段。然后我们看选项:
A是创建调用存储过程
CallableStatement
对象的,沾不上边;
C是注册数据库驱动程序
D可以发送sql语句,但那是静态的,就容易被SQL注入,这就是我们要避免的。
9.下面关于 executeQuery(String sql)方法,说法正确的是( )。
A.可以执行 insert 语句
B.可以执行 update 语句
C.可以执行 select 语句
D.可以执行 delete 语句
选C
解析:直接看方法名——Query,都叫查询了你还不顺从它?顺带一提,update和delete都是调用executeUpdate(String sql)方法的
10.下面选项中,能够将游标从当前位置向下移一行的方法是( )。
A.next()
B.absolute(int row)
C.previous()
D.last()
直接选A
解析,查询回来的集合的指针是指向第一行之前的(可以理解成第0行?!),调用next()方法就会判断下一行也没有数据,然后向下进一行。后面就是重复这个过程而已
11.程序中创建了一个 Servlet,该 Servlet 重写了其父类的 doGet()和 doPost()方法,那么其 父类可能是 ( )。
A.RequestDispatcher
B.HttpServletResponse
C.HttpServletRequest
D.HttpServlet
选D
解析:这里都说了让你找servlet的父类,ABC怎么看都不像嘛;
A是一个接口,用于请求转发导另一个资源的(比如JSP或者另一个servlet)
B是封装HTTP响应的对象的
C是封装HHTP请求的对象的
这俩卧龙凤雏你见的又不少,没理由选的
12.给定 Servlet程序的代码如下所示
public class Servlet1 extends HttpServlet{
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException IOException{
System.out.println(“get”);
}
public void doPost(HttpServletRequest request.HttpServletResponse response)
throws ServletException,IOException{
System.out.println(“post”);
doGet(reauest,response);
}
}
用户在浏览器地址栏中键入正确的请求 URL 并回车后,在控制台上显示的结果是( )。
A.get
B.post
C.get post
D.post get
选A
解析:这里特地说了在地址栏键入正确的请求URL,这实际上是默认在使用GET方法的,所以直接doGET()了,Post是需要保存到对应的请求体的。
13.某一 JSP 页面的表单中,有几个复选框,复选框 name 为“habit”,则该表单提交后,下面 能获取用户选中复选框的值的语句是( )。
A.request.getAttribute("habit");
B.response.getParameterValues("habit");
C.request.getParameter("habit");
D.request.getParameterValues("habit");
选D
解析:首先B直接排除,不解释
A、getAttribute这个方法能取的只能是setAttribute亲自放进去的属性
C、这个方法只能获取单个属性,适用于单选框或者复选框只选中一个的情况,不适合获取多个复选框的值。
14.下面选项中, 用于实现一个 Web 应用中的所有 Servlet 共享数据的对象是( )。
A.HttpSession
B.ServletContext
C.ServletConfig
D.ServletRequest
选B
解析:A、每个用户的session是唯一的,怎么可能拿来共享呢
C、获取Servlet配置信息的,这也是每个Servlet独自拥有的,你不能指望全世界的人跟你穿同一条裤衩吧
D、用于封装客户端请求的信息,但是不同请求之间肯定不能共享,否则一定会产生冲突
15.JSP Model2 开发的系统中,实现视图的是( )。
A.JSP
B.HTML
C.JavaBean
D.Servlet
选A
解析:老生常谈了,首先排除B,这里没HTML什么事,剩下三个选词填空M,V,C;Bean肯定是M,Servlet是C,那V是谁呢?
16.下面关于 MVC 设计模式的特点描述中,错误的是( )。
A.有利于开发中的分工
B.使程序结构的耦合性增强
C.有利于组件的重用
D.MVC 设计模式是当前主流的设计模式之一
选B
解析:懒得讲,耦合性低,各个结构更独立,这就是MVC想干的事情,不选B是要倒反天罡吗
17.下列选择中,哪个响应头能够使客户端访问服务器资源时采用下载窗口打开( )。
A.Content-Disposition
B.Content-Type
C.Content-Encoding
D.Disposition
选A
解析:A、如果设置为
attachment
,则提示用户下载文件,通常配合
filename
参数指定下载文件的文件名。这么看好像不是很明确,我们直接看其他选项
B、这玩意是指定响应体的媒体类型的,跟下载没关系
C、这是指定响应体的内容编码方式的,也没关系
D、这个选项格式都不对,根本不符合HTTP响应头的字段格式,排除
18.下面用于获取文件上传字段中的文件名的方法是( )。
A.getName()
B.getType()
C.getContentType()
D.getString()
选A
解析:一般而言,表单提交的都是<input type="file" name="fieldName">这样的格式,←这么大个name,你说选谁。
B是获取文件MIME类型的;C是获取文件内容类型;D是获取字符串的,更偏了
19.下列对于 Cookie 对象的 setMaxAge(-1)方法的描述中,正确的是( )。
A.表示通知浏览器保存这个 Cookie 信息
B.表示通知浏览器立即删除这个 Cookie 信息
C.表示当浏览器关闭时,Cookie 信息会被删除
D.以上说法都是错误的
选C
解析:往这个方法里塞-1,就相当于没调用过这个方法;这个方法是设置Cooike的有效时间的。现在没调用,则Cooike的生命周期仅限于浏览器会话,关闭即删
20.假设现在浏览器发起一个请求,它需要访问用户表第 3 页的数据,每页默认最多显示 10 条, MySQL 分页查询正确的 SQL 是( )。
A.select * from user limit 20,10;
B.select * from user limit 10,10;
C.select * from user limit 30,10;
D.select * from user limit 3,10;
选A
解析:对于Limit关键字,select * from user limit 参数1,参数2;
参数1是指跳过多少条数据;
参数2是分成多少条一页;
那从3页开开头肯定是第21条,直接把A秒了
二、判断题
1.B/S 架构中,浏览器并不是直接与数据库服务器建立连接,而是需要通过 Web 服务器与数据库服务器建立连接。( )
答案:√
解析:浏览器需要通过发送HTTP请求与Web服务器进行交互,由服务器进行与数据库服务器连接,毕竟浏览器只要管被人看就行了,而我们服务端要考虑的就很多了
2.Tomcat 服务器默认的端口号是 8080。( )
答案:√
解析:你tomcat创建的时候去的哪个端口你心里有数
3.JSP 隐式对象 out 可以通过 response.getWriter()方式获取,然后再通过 println()或者 write()方法向页面发送文本内容。( )
答案:×
解析:out这个隐式对象是JSPWrite对象,而
response.getWriter()
返回的是一个
PrintWriter
对象,牛头不对马嘴的,转换不了一点
4.EL 表达式都是以“${”符号开始,以“}”符号结束的,具体语法格式是${表达式}。( )
答案:√
解析:没解析,EL表达式就长这样
5.对于相同的 SQL 语句,Statement 对象只会对其编译执行一次。( )
答案:×
解析:注意甄别Statement和PreparedStatement。Statement每次执行都会编译的,而
PreparedStatement
对象是预编译的。它在创建时会将 SQL 语句预编译,并且可以使用不同的参数重复执行多次,而无需每次重新编译
6.ResultSet 接口表示 select 查询语句得到的结果集,该结果集封装在一个逻辑表格中。 ()
答案:√
解析:略;结果集不装逻辑表格装什么
7.在 Servlet 的整个生命周期中,destroy()方法会被调用一次。( )
答案:√
解析:Servlet一定会经历初始化、服务、销毁这三个阶段,其中初始化和销毁只做一次
8.ServletRequest 接口的 setAttribute()方法用于将一个对象与一个 name 关联后存储进 ServletRequest 对象中。( )
答案:√
解析:就是存键值对,我没意见的
9.JSP Model1 架构模型采用 JSP+Servlet+JavaBean 的技术,实际上它就是 MVC 设计模式。 ( )
答案:×
解析:倒反天罡,Model2才是MVC
10.控制器负责管理应用程序的业务数据、定义访问控制以及修改这些数据的业务规则。( )
答案:×
解析:控制器是处理用户请求的,管理业务数据这些是Model模型该做的事情
三、填空题
1.JSP 脚本元素主要包含三种类型,分别是 JSP Scriptlets、声明标识和( )。
答案:JSP表达式(一开始居然填了HTML,该死)
解析:死记,因为我也记不住
2.在 JSP 页面中,Core 标签库提供了一个( )标签对集合对象进行循环迭代操作。
答案:<c:forEach>
解析:没解析,死记
3.( )指令用于在 JSP 页面中包含另一个 JSP 页面
答案:include
解析:同上
4.Statement 接口的 executeUpdate(String sql)方法用于执行 SQL 中的增加、 ( )和 删除语句。
答案:修改
解析:增加、修改、删除这仨本质上不就是更新操作吗
5.( )接口表示 Java 程序和数据库的连接,只有获得该连接对象后才能访问数据库,并 操作数据库表。
答案:Connection
解析:死记,别到时候不会写这个单词了
6.Servlet API 中,专门用来封装 HTTP 响应消息的接口是( )。
答案:HttpServletResponse
解析:死记,驼峰命名小子,别写错
7.Filter 被称为( ),其基本功能是对 Servlet 容器调用 Servlet 的过程进行拦截,它 位于客户端和处理程序之间,能够对请求和响应进行检查和修改。
答案:过滤器
解析:翻译题
8.JSP Model2 模型就是( )设计模式。
答案:MVC
解析:记
9.文件上传时 form 表单的 method 属性设置为( )方式。
答案:Post
答案:Get装不下,传不走
10.( )是 MySQL 中的一个特殊关键字,用于指定查询结果从哪条记录开始显示,一共显 示多少条记录。
答案:Limit
解析:你MySQL学的好吗
四、简答题
1.简述 JSP 隐式对象 request、response、exception 和 out 对象的作用。
JSP隐式对象是指由Web容器自动创建的一些特殊对象,可以在JSP页面中直接使用而无需进行额外的声明和初始化。其中,request、response、exception和out四个隐式对象分别的作用如下:
(1)request对象:封装HTTP请求信息,它可以获取浏览器发送的参数信息、Cookie信息、请求头信息等,同时也可以向其他Servlet或JSP页面传递数据。可以使用request.setAttribute()方法设置属性,使用request.getAttribute()方法获取属性。
(2)response对象:封装HTTP响应信息,通过response对象,可以向浏览器发送响应消息,例如:设置Cookie、重定向到其他页面、设置HTTP响应头等。常用的方法有response.getWriter()方法获取输出流、response.sendRedirect()方法进行重定向。
(3) exception对象:封装当前发生异常的相关信息,例如异常的原因、类型、栈轨迹等。可以通过在JSP页面中添加errorPage指令,当JSP页面出现异常时,自动跳转到指定的错误页面。
(4)out对象:提供JSP页面向客户端输出信息的方式,它是一个PrintWriter对象,可以使用out.print()、out.write()等方法将文本、HTML或其他类型的内容输出到浏览器。
综上所述,request、response、exception、out这四个JSP隐式对象,分别用于封装和处理HTTP请求和响应相关的信息和功能,可以帮助开发人员更方便地开发Web应用程序。
MVC(Model-View-Controller)是一种软件架构模式,用于组织和设计应用程序的结构,以实现业务逻辑、用户界面和数据之间的解耦。
2.简述请求转发与重定向的区别。
请求转发和重定向是Java Web中两种常用的页面跳转方式,它们的主要区别如下:
(1)前者是服务器内部流程,在服务器端完成重定向,跳转的是同一个请求,而后者是客户端请求过程中的跳转,跳转时客户端发起新的请求。
(2)请求转发是服务器内部的操作,整个请求操作由服务器完成,客户端浏览器是无法感受到的;而重定向是客户端浏览器行为,服务器端只是一句响应指令,让客户端重新发起一个新的请求,从而进行跳转。
(3)在请求转发的过程中,服务器将请求传递给下一个页面,共享请求的上下文(Context),所以多个页面之间可以方便地共享数据;而在重定向的过程中,客户端发送了一个新的请求,上一个请求的上下文被销毁,所以无法共享数据。
(4)请求转发速度比重定向快,因为它只是将请求重定向到服务器内部的另一个页面,而重定向需要让客户端重新发送请求,再重新响应,速度相对较慢。综上所述,请求转发和重定向是两种不同的处理方式,请求转发是服务器内部的处理,速度较快,可以共享请求上下文,而重定向直接把跳转的任务交给了浏览器,速度较慢,无法共享请求上下文。选择使用哪种方式,主要根据实际需求而定。
3.简述 Servlet 接口中 init 方法、service 方法、destroy 方法的作用。
Servlet接口中,init()方法、service()方法、destroy()方法的作用如下:
(1) init() 方法:在Servlet对象被创建时执行。该方法的作用是初始化Servlet,它只会被执行一次,并且在Servlet实例化之后立即执行。init() 方法通常用于加载配置文件、初始化数据库连接、获取服务器资源等操作。
(2) service() 方法:每当有用户请求发生时,容器就会调用 service() 方法,并将请求传给该方法。该方法接受客户端请求并给出响应。在 service() 方法中,通常会根据不同的请求类型,调用不同的方法来处理请求,例如 doGet() 方法和 doPost() 方法。
(3) destroy() 方法:当Servlet容器(例如Tomcat)重新加载或关闭Web应用程序时,容器将调用destroy()方法,在该方法中可以执行清理活动(例如关闭数据库连接)和显式释放在Servlet初始化期间分配的其他资源。该方法只会被执行一次, Servlet容器在运行时不会再次调用Servlet实例的service()/doGet()/doPost()等方法。
综上所述,init()方法在Servlet对象被创建时执行,service()方法对每个用户请求进行响应,而destroy()方法在Web应用程序关闭或Servlet容器重新加载时执行清理操作。它们三个一起构成了Servlet的生命周期。
4. 简述使用 PrepareStatement 执行 SQL 的好处。
使用
PreparedStatement
执行 SQL 查询和更新操作相比于使用普通的
Statement
具有以下几个好处:
- 预编译:
PreparedStatement
对象在执行前会先进行预编译,即数据库会对 SQL 语句进行解析、编译和优化。这样,当多次执行相同的 SQL 语句时,数据库只需要执行一次编译过程,提高了执行效率。 - 安全性:
PreparedStatement
可以有效防止 SQL 注入攻击。通过使用参数化查询(即将变量绑定到 SQL 查询中的占位符上),可以确保用户输入不会被误解为 SQL 语句的一部分,从而增强了安全性。 - 可读性和维护性:使用
PreparedStatement
使得 SQL 查询与 Java 代码分离,提高了代码的可读性和维护性。参数化查询使得 SQL 查询更加清晰,易于理解和修改。 - 性能优化:由于
PreparedStatement
的预编译和参数化查询,数据库在执行相同或类似的 SQL 查询时可以使用查询缓存,进一步提高了查询的性能。 - 支持批处理:
PreparedStatement
支持批处理操作(Batch Processing)。可以将多个 SQL 语句一次性提交给数据库执行,减少了与数据库的通信次数,从而提高了整体的性能表现。
综上所述,使用
PreparedStatement
能够有效提升数据库操作的性能、安全性和可维护性,是开发中推荐使用的 SQL 执行方式之一。
5、JSP Model2 架构模型采用了什么技术,各项技术对应 MVC 的哪一模块,作用是什么。
JSP Model2架构模型采用了以下技术:
(1)Servlet技术:用于实现控制器(Controller)模块。控制器接受客户端请求,处理请求,将结果传递给视图模块。
(2)JSP技术:用于实现视图(View)模块。视图生成最终的HTML、CSS、JavaScript等静态文件,将控制器返回的数据展示给用户。
(3) JavaBean技术:用于实现模型(Model)模块。模型负责处理业务逻辑,与数据库交互,提供数据给控制器,控制器再将数据传递给视图。
(4)Servlet技术对应于MVC的控制器模块,负责接收并处理客户端请求,调用JavaBean处理业务逻辑,并将处理结果传递给JSP视图。
(5)JSP技术对应于MVC的视图模块,负责将数据展示给用户,生成最终的HTML、CSS、JavaScript等静态文件,将用户的请求发送给控制器。
(6)JavaBean技术对应于MVC的模型模块,负责处理业务逻辑,与数据库交互,提供数据给控制器,从而完成整个MVC模型的数据处理和业务逻辑处理。
五、综合应用题
1.以下是查询用户表的部分代码,以表格形式显示在网页上。请补全 JSTL 代码。
Servlet 核心代码如下:
UserDao userDao = new UserDao();
List<User> list = Collections.emptyList();
try {
list = userDao.findAll( );
} catch (DataAccessException e) {
e.printStackTrace();
}
// 通过 request 对象共享数据给视图
request.setAttribute("userList", list);
request.getRequestDispatcher("/user/user_list.jsp").forward(request, response);
请根据以上信息,写出 user_list.jsp 中输出用户列表的 JSTL 代码,以使其达到如下网页显示 效果:
答案:代码如下:
<table border="1">
<tr>
<th>编号</th>
<th>姓名</th>
<th>性别</th>
<th>职业</th>
<th>注册日期</th>
<th>角色</th>
<th>状态</th>
<th>操作</th>
</tr>
<c:forEach var="user" items="${userList}">
<tr>
<td>${user.user_id}</td>
<td>${user.username}</td>
<td>${user.gender}</td>
<td>${user.profession}</td>
<td>${user.create_date}</td>
<td>${user.role}</td>
<td>${user.state}</td>
<td>
<a>详情</a>
<a>修改</a>
<a>重置密码</a>
<a>锁定</a>
<a>删除</a>
</td>
</tr>
</c:forEach>
</table>
2.接上题。在本题中,我们需要通过设计一个 MVC 模式的程序,去完成用户修改的功能。(15 分)
其中,视图层(user_edit_data.jsp)代码为:
<form role="form" action="${pageContext.request.contextPath}/UserEdit.do"
method="post">
<div class="form-group">
<label for="username">
用户名:
</label>
<input name="username" value='${userDetail.username }' type="text"
class="form-control"
id="username" required="required" readonly="readonly"/>
<input type="hidden" name="userId" value="${userDetail.userId}">
</div>
<div class="radio">
<label>性别:</label>
<input type="radio" name="gender" value="男">男
<input type="radio" name="gender" value="女">女
</div>
<div class="radio">
<label>角色:</label>
<input type="radio" name="role" value="0">普通用户
<input type="radio" name="role" value="9">管理员
</div>
<div class="form-group">
<label for="profession">职业:</label>
<select name="profession" class="form-control" id="profession">
<option value="无">-- 请选择 --</option>
<option value="学生">学生</option>
<option value="教师">教师</option>
<option value="其他">其他</option>
</select>
</div>
<div class="checkbox">
<label>兴趣爱好:</label><input type="checkbox" name="favor" value="学习
">学习
<input type="checkbox" name="favor" value="读书">读书
<input type="checkbox" name="favor" value="看报">看报
<input type="checkbox" name="favor" value="编程">编程
<input type="checkbox" name="favor" value="算法">算法
<input type="checkbox" name="favor" value="算法 2">算法 2
<input type="checkbox" name="favor" value="算法 3">算法 3
</div>
<div class="form-group">
<label for="description">个人说明:</label>
<textarea id="description" name="description" class="form-control"
rows="3">${userDetail.description }</textarea>
</div>
<button type="button" class="btn btn-primary">
确认修改
</button>
<button type="button" class="btn btn-default">取消</button>
<small><a href="javascript:window.history.back(-1)">返回</a></small>
</form>
控制层(PreEditServlet.java)核心代码为:
49 UserDao userDao = new UserDao();
50 User user = null;
51 try {
52 user = userDao.findById(Integer.parseInt(userId));
53 } catch (DataAccessException e) {
54 response.sendError(500, e.getMessage());
55 e.printStackTrace();
56 return;
57 }
58
59 if (user != null) {
60 // 通过 request
61 request.setAttribute("userDetail", user);
62
request.getRequestDispatcher("/user/user_edit_data.jsp").forward(request,
response);
63 } else {
64 response.sendError(500, "没有对应的用户!");
65 }
请根据上述已知条件,回答如下问题: (
1)jsp 中的第一行代码“${pageContext.request.contextPath}”是什么作用?
(2)jsp 中的 6-8 行代码,为什么要用 readonly 属性和 hidden 属性?
(3)通过阅读代码上下文,找出修改用户是依据数据库的哪个字段来完成查询的?
(4)题干中没有给出模型层代码(UserDao.java),请根据上下文,推测 52 行代码对应的 UserDao 中的预编译 sql 代码如何编写?
(5)阅读 29-37 行代码,如果需要在 Servlet 中获取所有勾选的“爱好”,则需要用什么代码才 能完整读取?
答案:
(1)
${pageContext.request.contextPath}
是一个 EL 表达式,用于获取当前 web 应用的上下文路径(Context Path)。这个表达式的作用是动态获取当前 web 应用的上下文路径,以确保表单提交的 action 地址是正确的相对路径,避免硬编码上下文路径导致的部署问题。
(2)
readonly="readonly"
属性将输入框设置为只读,这样用户无法直接编辑用户名字段,仅能查看当前用户的用户名。
<input type="hidden">
表单域是隐藏的,用户不可见,用于存储用户的 ID。这样在表单提交时,可以将用户的 ID 作为参数传递给后台处理修改操作,而不需要用户手动输入或修改。
(3)
根据控制层代码
PreEditServlet.java
第 52 行,通过
userDao.findById(Integer.parseInt(userId))
方法来查询用户信息,其中
userId
是用于查询的用户 ID 字段。因此,修改用户是依据数据库中的
userId
字段来完成查询的。
(4)代码如下:
public User findById(int userId) throws DataAccessException {
User user = null;
String sql = "SELECT * FROM users WHERE userId = ?";
try (Connection conn = getConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setInt(1, userId);
try (ResultSet rs = ps.executeQuery()) {
if (rs.next()) {
// Mapping ResultSet to User object
user = new User();
user.setUserId(rs.getInt("userId"));
user.setUsername(rs.getString("username"));
// Set other fields accordingly
}
}
} catch (SQLException e) {
throw new DataAccessException("Error querying user by ID", e);
}
return user;
}
(5)代码如下:
String[] hobbies = request.getParameterValues("favor");
if (hobbies != null) {
for (String hobby : hobbies) {
System.out.println("Selected hobby: " + hobby);
}
}
3.MVC 思想中,很重要的一个技术就是 JavaBean。而 JavaBean 根据功能和作用不同,又分成很 多种不同的类型,比如实体类和数据处理对象(DAO)。请你结合第 1.2 题的题干,回答以下关于 JavaBean 的问题。
(1)实体类在前面两道题中承担了非常重要的功能,比如 jsp 中显示的用户信息的 EL 表达式就 是在读取实体类的属性。请你描述一下实体类应遵循的编程规范有哪些?
答案:(答五点差不多了就)
1命名规范:
- 类名应使用名词形式,首字母大写,驼峰命名法(Camel Case),如
User
。 - 属性名应使用驼峰命名法,且避免使用下划线和美元符号,如
userId
,username
。
2属性的封装:
- 所有属性应该使用私有访问修饰符 (
private
),以确保数据封装和安全性。 - 提供公共的 getter 和 setter 方法来访问和修改属性值.
3默认构造方法:
- 提供一个无参构造方法(默认构造方法),以便框架和反射机制可以实例化对象。
**4重写
equals()
和
hashCode()
方法**:
- 如果需要在集合中比较对象的相等性,则应重写
equals()
和hashCode()
方法,保证它们的一致性和正确性。
5实现序列化接口:
- 如果实体类需要在网络上传输或持久化存储,则应实现
Serializable
接口,确保对象可以序列化和反序列化。
6添加文档注释:
- 对类和每个公共方法添加适当的文档注释(Javadoc),描述类的作用、属性的含义和方法的用途。
7避免业务逻辑:
- 实体类应专注于表示数据结构,不应包含业务逻辑和数据访问逻辑,这些逻辑应由其他层(如服务层和数据访问层)处理。
8保持简洁和高内聚性:
- 避免实体类过于复杂和臃肿,保持单一职责原则,每个实体类应该只表示一个明确的概念或实体。
(2)EL 表达式${user.username }的本质是在访问 JavaBean 的成员变量还是在访问 getter 方 法?
答案:EL 表达式
${user.username}
的本质是在访问 JavaBean 的 getter 方法。EL 表达式
${user.username}
实际上会调用
getUser().getUsername()
方法来获取
username
属性的值,而不是直接访问类的成员变量。
(3)请根据(1)题的规范写出 t_user 表对应的实体类的示例代码,至少包含 2 个成员变量及 对应的方法。
答案:代码如下:(按题意来,写个三四个属性就行了,注意私有和toString方法)
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private int userId;
private String username;
private String gender;
private String profession;
private Date registerDate;
private int role;
private int status;
// 默认构造方法
public User() {
}
// Getter 方法
public int getUserId() {
return userId;
}
public String getUsername() {
return username;
}
public String getGender() {
return gender;
}
public String getProfession() {
return profession;
}
public Date getRegisterDate() {
return registerDate;
}
public int getRole() {
return role;
}
public int getStatus() {
return status;
}
// Setter 方法
public void setUserId(int userId) {
this.userId = userId;
}
public void setUsername(String username) {
this.username = username;
}
public void setGender(String gender) {
this.gender = gender;
}
public void setProfession(String profession) {
this.profession = profession;
}
public void setRegisterDate(Date registerDate) {
this.registerDate = registerDate;
}
public void setRole(int role) {
this.role = role;
}
public void setStatus(int status) {
this.status = status;
}
// 可以添加其他 setter 和 getter 方法...
@Override
public String toString() {
return "User{" +
"userId=" + userId +
", username='" + username + '\'' +
", gender='" + gender + '\'' +
", profession='" + profession + '\'' +
", registerDate=" + registerDate +
", role=" + role +
", status=" + status +
'}';
}
}
版权归原作者 像污秽一样 所有, 如有侵权,请联系我们删除。