0


《Web 程序设计》JAVA 版期末试卷

一、单项选择题

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

具有以下几个好处:

  1. 预编译PreparedStatement 对象在执行前会先进行预编译,即数据库会对 SQL 语句进行解析、编译和优化。这样,当多次执行相同的 SQL 语句时,数据库只需要执行一次编译过程,提高了执行效率。
  2. 安全性PreparedStatement 可以有效防止 SQL 注入攻击。通过使用参数化查询(即将变量绑定到 SQL 查询中的占位符上),可以确保用户输入不会被误解为 SQL 语句的一部分,从而增强了安全性。
  3. 可读性和维护性:使用 PreparedStatement 使得 SQL 查询与 Java 代码分离,提高了代码的可读性和维护性。参数化查询使得 SQL 查询更加清晰,易于理解和修改。
  4. 性能优化:由于 PreparedStatement 的预编译和参数化查询,数据库在执行相同或类似的 SQL 查询时可以使用查询缓存,进一步提高了查询的性能。
  5. 支持批处理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 +
                '}';
    }
}

本文转载自: https://blog.csdn.net/m0_73302939/article/details/139998305
版权归原作者 像污秽一样 所有, 如有侵权,请联系我们删除。

“《Web 程序设计》JAVA 版期末试卷”的评论:

还没有评论