《Web 程序设计》JAVA 版期末试卷
像污秽一样 2024-07-07 10:03:23 阅读 98
目录
一、单项选择题
1.安装 tomcat 成功后,如要修改 tomcat 端口,要修改的文件是( )。
2.Java Web 开发服务端程序所需具备的技能不包括( )。
3.需要在 JSP 页面中引入 java.util.*包,需要用到的指令是( )。
4.阅读下列 JSP 代码片断: 其运行结果是( )。
5.在 c_if.jsp 有如下部分代码
6.下面关于 EL 表达式${(1==2)?3:4}的运算结果,正确的是( )。
7.下列选项,可用于存储结果集的对象是( )。
8.下面选项中,用于创建将参数化的 SQL 语句发送到数据库的对象方法是( )。
9.下面关于 executeQuery(String sql)方法,说法正确的是( )。
10.下面选项中,能够将游标从当前位置向下移一行的方法是( )。
11.程序中创建了一个 Servlet,该 Servlet 重写了其父类的 doGet()和 doPost()方法,那么其 父类可能是 ( )。
12.给定 Servlet程序的代码如下所示
13.某一 JSP 页面的表单中,有几个复选框,复选框 name 为“habit”,则该表单提交后,下面 能获取用户选中复选框的值的语句是( )。
14.下面选项中, 用于实现一个 Web 应用中的所有 Servlet 共享数据的对象是( )。
15.JSP Model2 开发的系统中,实现视图的是( )。
16.下面关于 MVC 设计模式的特点描述中,错误的是( )。
17.下列选择中,哪个响应头能够使客户端访问服务器资源时采用下载窗口打开( )。
18.下面用于获取文件上传字段中的文件名的方法是( )。
19.下列对于 Cookie 对象的 setMaxAge(-1)方法的描述中,正确的是( )。
20.假设现在浏览器发起一个请求,它需要访问用户表第 3 页的数据,每页默认最多显示 10 条, MySQL 分页查询正确的 SQL 是( )。
二、判断题
三、填空题
四、简答题
1.简述 JSP 隐式对象 request、response、exception 和 out 对象的作用。
2.简述请求转发与重定向的区别。
3.简述 Servlet 接口中 init 方法、service 方法、destroy 方法的作用。
4. 简述使用 PrepareStatement 执行 SQL 的好处。
5、JSP Model2 架构模型采用了什么技术,各项技术对应 MVC 的哪一模块,作用是什么。
五、综合应用题
1.以下是查询用户表的部分代码,以表格形式显示在网页上。请补全 JSTL 代码。
2.接上题。在本题中,我们需要通过设计一个 MVC 模式的程序,去完成用户修改的功能。(15 分)
3.MVC 思想中,很重要的一个技术就是 JavaBean。而 JavaBean 根据功能和作用不同,又分成很 多种不同的类型,比如实体类和数据处理对象(DAO)。请你结合第 1.2 题的题干,回答以下关于 JavaBean 的问题。
一、单项选择题
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 的端口号,需要在 <code>server.xml 文件中找到 <Connector>
元素并修改其 port
属性。示例:
<Connector port="8080" protocol="HTTP/1.1"code>
connectionTimeout="20000"code>
redirectPort="8443" />code>
<!--要修改端口号,只需将 port 属性的值从 8080 改为所需的端口号,例如:-->
<Connector port="9090" protocol="HTTP/1.1"code>
connectionTimeout="20000"code>
redirectPort="8443" />code>
2.Java Web 开发服务端程序所需具备的技能不包括( )。
A.JSP
B.CSS
C.Servlet
D.JDBC
选B
解析:开发服务端(后端)要什么CSS,那是前端的(客户端);
3.需要在 JSP 页面中引入 java.util.*包,需要用到的指令是( )。
A.
<%@page import="java.util.*" %>code>
B.
<%@taglib import="java.util.*" %code>
C.
<%@page package="java.util.*" %>code>
D.
<%@include import="java.util.*" %>code>
直接选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" >code>
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对象,而<code>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 核心代码如下:
<code>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 代码,以使其达到如下网页显示 效果:
答案:代码如下:
<tr>
<th>编号</th>
<th>姓名</th>
<th>性别</th>
<th>职业</th>
<th>注册日期</th>
<th>角色</th>
<th>状态</th>
<th>操作</th>
</tr>
<c:forEach var="user" items="${userList}">code>
<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)代码为:
<code><form role="form" action="${pageContext.request.contextPath}/UserEdit.do"code>
method="post">code>
<div class="form-group">code>
<label for="username">code>
用户名:
</label>
<input name="username" value='${userDetail.username }' type="text"code>
class="form-control"code>
id="username" required="required" readonly="readonly"/>code>
<input type="hidden" name="userId" value="${userDetail.userId}">code>
</div>
<div class="radio">code>
<label>性别:</label>
<input type="radio" name="gender" value="男">男code>
<input type="radio" name="gender" value="女">女code>
</div>
<div class="radio">code>
<label>角色:</label>
<input type="radio" name="role" value="0">普通用户code>
<input type="radio" name="role" value="9">管理员code>
</div>
<div class="form-group">code>
<label for="profession">职业:</label>code>
<select name="profession" class="form-control" id="profession">code>
<option value="无">-- 请选择 --</option>code>
<option value="学生">学生</option>code>
<option value="教师">教师</option>code>
<option value="其他">其他</option>code>
</select>
</div>
<div class="checkbox">code>
<label>兴趣爱好:</label><input type="checkbox" name="favor" value="学习
">学习code>
<input type="checkbox" name="favor" value="读书">读书code>
<input type="checkbox" name="favor" value="看报">看报code>
<input type="checkbox" name="favor" value="编程">编程code>
<input type="checkbox" name="favor" value="算法">算法code>
<input type="checkbox" name="favor" value="算法 2">算法 2code>
<input type="checkbox" name="favor" value="算法 3">算法 3code>
</div>
<div class="form-group">code>
<label for="description">个人说明:</label>code>
<textarea id="description" name="description" class="form-control"code>
rows="3">${userDetail.description }</textarea>code>
</div>
<button type="button" class="btn btn-primary">code>
确认修改
</button>
<button type="button" class="btn btn-default">取消</button>code>
<small><a href="javascript:window.history.back(-1)">返回</a></small>code>
</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"code> 属性将输入框设置为只读,这样用户无法直接编辑用户名字段,仅能查看当前用户的用户名。
<input type="hidden">code> 表单域是隐藏的,用户不可见,用于存储用户的 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 + '\'' +code>
", gender='" + gender + '\'' +code>
", profession='" + profession + '\'' +code>
", registerDate=" + registerDate +
", role=" + role +
", status=" + status +code>
'}';
}
}
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。