2023年6月20日发(作者:)
⿊马程序员《JavaWeb程序设计案例教程》_课后习题答案第⼀章【测⼀测】学习完前⾯的内容,下⾯来动⼿测⼀测吧,请思考以下问题:1、请描述HTML、CSS、DOM、JavaScript分别表⽰的含义。2、请列举出HTML常⽤的标记。(⾄少10个)3、请编写出⼀个HTML页⾯,令其输出“hello world!~~”,使⽤css将其字体设置为宋体红⾊。4、编写⼀个HTML页⾯,页⾯包含数字和按钮两部分,每次单击按钮可以使数字加⼀。【答案】1、HTML:HTML是英⽂Hyper Text Markup Language的缩写,中⽂译为“超⽂本标记语⾔”,其主要作⽤是通过HTML标记对⽹页中的⽂本、图⽚、声⾳等内容进⾏描述。CSS:CSS 是 Cascading Style Sheet 的缩写,译作“层叠样式表单”,是⽤于(增强)控制⽹页样式并允许将样式信息与⽹页内容分离的⼀种标记性语⾔。DOM:DOM是Document Object Model(⽂档对象模型)的简称,是W3C组织推荐的处理可扩展标志语⾔的标准编程接⼝,它可以以⼀种独⽴于平台和语⾔的⽅式访问和修改⼀个⽂档的内容和结构。JavaScript:JavaScript是Web中⼀种功能强⼤的脚本语⾔,被设计为向 HTML 页⾯增加交互性,常⽤来为⽹页添加各式各样的动态功能,它不需要进⾏编译,直接嵌⼊在HTML页⾯中,就可以把静态的页⾯转变成⽀持⽤户交互并响应事件的动态页⾯。2、HTML常⽤的标记有:1)2)3)4)
5)
6)7)
8)
9)10)3、HTML页⾯代码如下:hello world!~~
hello world!~~4、HTML页⾯代码如下:第⼆章【测⼀测】学习完前⾯的内容,下⾯来动⼿测⼀测吧,请思考以下问题:1、简述HTTP1.1协议的通信过程?2、简述POST请求和GET请求有什么不同?(⾄少2点)3、请列举出Tomcat安装⽬录下的⼦⽬录,并对其进⾏简要说明?(⾄少列出5个)4、请编写⼀个格式良好的XML⽂档,要求包含⾜球队⼀⽀,队名为Madrid,球员5⼈:Ronaldo、Casillas、Ramos、Modric、Benzema;篮球队⼀⽀,队名为Lakers,队员2⼈:Oneal,Bryant。⾥⾯要求含有注释,注释内容⾃定。【答案】1、HTTP1.1协议的通信过程如下:1. 客户端与服务器端建⽴TCP连接。2. 客户端可以向服务器端发送多个请求,并且在发送下个请求时,⽆需等待上次请求的返回结果。3. 服务器必须按照接受客户端请求的先后顺序依次返回响应结果。4)客户端发出关闭TCP连接的请求。4. 服务器端关闭TCP连接。2、POST请求和GET请求主要有如下不同:1. POST传输数据⼤⼩⽆限制2. POST⽐GET请求⽅式更安全3、Tomcat安装⽬录下的⼦⽬录及其说明如下:bin:⽤于存放Tomcat的可执⾏⽂件和脚本⽂件(扩展名为.bat的⽂件),如、;conf:⽤于存放Tomcat的各种配置⽂件,如、;lib:⽤于存放Tomcat服务器和所有Web应⽤程序需要访问的JAR⽂件;logs:⽤于存放Tomcat的⽇志⽂件;temp:⽤于存放Tomcat运⾏时产⽣的临时⽂件;webapps:Web应⽤程序的主要发布⽬录,通常将要发布的应⽤程序放到这个⽬录下;work:Tomcat的⼯作⽬录,JSP编译⽣成的Servlet源⽂件和字节码⽂件放到这个⽬录下。4、XML页⾯代码如下:<球队列表><球队 类型=“⾜球队”><队名>Madrid队名><队员><姓名>Ronaldo姓名><姓名>Casillas姓名><姓名>Ramos姓名><姓名>Modric姓名><姓名>Benzema姓名>队员>球队><球队 类型=“篮球队”><队名>Lakers队名><队员><姓名>Oneal姓名><姓名>Bryant姓名>队员>球队>球队列表>第三章【测⼀测】学习完前⾯的内容,下⾯来动⼿测⼀测吧,请思考以下问题:1、请列举Servlet接⼝中的⽅法,并分别说明这些⽅法的特点及其作⽤。2、简述ServletContext接⼝的三个主要作⽤。3、编写⼀个servlet,实现统计⽹站被访问次数的功能。4、请编写⼀段程序,使程序能读取该servlet的配置信息,从中获得参数名为encoding对应的参数值,并输出到页⾯上。【答案】1、Servlet接⼝中有init、service、destroy 、getServletConfig和getServletInfo这 5个⽅法,这些⽅法的特点及其作⽤具体如下:1)init(ServletConfig config)⽅法,该⽅法在服务器对Servlet第⼀次访问时调⽤,负责Servlet初始化⼯作。在⼀个Servlet的⽣命周期中只执⾏⼀次。该⽅法接收⼀个ServletConfig类型的参数,Servlet容器可以通过这个参数向Servlet传递初始化配置信息。2)service(ServletRequest request,ServletResponse response)⽅法,该⽅法负责响应⽤户的请求,当容器接收到客户端访问Servlet对象的请求时,就会调⽤此⽅法。3)destroy()⽅法,该⽅法⽅法负责释放Servlet对象占⽤的资源。当Servlet对象被销毁时,容器会调⽤此⽅法。4)getServletConfig()⽅法,该⽅法返回容器调⽤init(ServletConfig config)⽅法时传递给Servlet的ServletConfig对象。5)getServletInfo()⽅法,该⽅法返回⼀个字符串,其中包含了关于Servlet的信息,例如,作者、版本和版权等信息。2、ServletContext接⼝的三个主要作⽤如下:1)获取Web应⽤程序的初始化参数2)实现多个Servlet对象共享数据3)读取Web应⽤下的资源⽂件3、实现步骤如下:1)新建⼀个类ShowTimesServlet继承HttpServlet,重写doGet和doPost⽅法2)在doPost⽅法中调⽤doGet⽅法,在doGet⽅法中实现统计⽹站被访问次数的功能,⽤户每请求⼀次Servlet,使访问次数times加13)获取ServletContext,通过它的功能记住上⼀次访问后的次数(1)ShowTimesServlet类的编写如下:public class ShowTimesServlet extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {ServletContext context = getServletContext();Integer times = (Integer) ribute(“times”);if (times == null) {times = new Integer(1);} else {times = new Integer(ue() + 1);}//设置编码,不然中⽂会变成乱码tentType(“text/html;charset=GB2312”);//得到输出流对象PrintWriter out=ter();n("");n(“当前页⾯被访问了”);n(""+times+“次”);//设置属性,将times保存到当前的上下⽂中ribute(“times”,times);}protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {(req, resp);}}(2)配置信息如下:mesServletShowTimesServlet/ShowTimesServlet4、实现代码如下:(1)TestServlet类如下:public class TestServlet extends HttpServlet {protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {PrintWriter out = ter();// 获得ServletConfig对象ServletConfig config = vletConfig();// 获得参数名为encoding对应的参数值String param = tParameter(“encoding”);n(“encoding=” + param);}protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {(request, response);}}(2)⽂件配置如下:rvletencodingUTF-8TestServlet/TestServlet第四章【测⼀测】学习完前⾯的内容,下⾯来动⼿测⼀测吧,请思考以下问题:1、简述请求转发与重定向的异同?(⾄少写3点)2、请写出禁⽌浏览器缓存页⾯的核⼼代码。3、请编写⼀个类,该类能够实现访问完app应⽤下的Servlet后,还能在浏览器地址栏中显⽰出的路径。4、请编写⼀个类,该类使⽤HttpServletRequest对象的getHeader(“referer”)⽅法实现下载资源防盗链的功能。【答案】1、请求转发与重定向的异同点如下:1)请求转发和重定向都可以实现访问⼀个资源时转向当前应⽤资源2)请求转发是⼀次请求⼀次响应,⽽重定向为两次请求两次响应3)⼀般情况下应该使⽤请求转发,减少浏览器对服务器的访问,减轻服务器压⼒4)如果需要改变浏览器的地址栏,或更改浏览器的刷新按钮的功能时需要使⽤重定向2、禁⽌浏览器缓存页⾯的核⼼代码如下:eHeader(“Expires”,0);der(“Cache-Control”,“no-cache”);der(“Pragma”,“no-cache”);3、实现代码如下:(1)MyServlet程序类如下:public class MyServlet extends HttpServlet {protected void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {n(“这⾥是MyServlet!”);direct(textPath() + “/”);}}(2)⽂件配置如下:letMyServlet/MyServlet第五章【测⼀测】学习完前⾯的内容,下⾯来动⼿测⼀测吧,请思考以下问题:1、简述什么是会话技术?2、简述Cookie与Session的区别?(⾄少写出3点)3、请设计⼀个类,使⽤Cookie技术实现显⽰⽤户上次访问时间的功能。要求如下:1)创建⼀个LastAccessServlet类,使其继承HttpServlet类并重写该类的doGet()⽅法。2)在doGet()⽅法中,使⽤kies()得到所有cookie形成的cookie数组,并进⾏遍历。3)如果遍历过程中找到cookie信息中存在lastAccess属性则输出,否则创建cookie对象设置值为当前时间并发送给客户端。4)cookie的存活时间为1⼩时,访问当前应⽤中的所有资源客户端都回送cookie信息。4、请设计⼀个程序,使⽤Session技术实现购物车功能。【答案】1、会话过程类似于⽣活中的打电话过程,它指的是⼀个客户端(浏览器)与Web服务器之间连续发⽣的⼀系列请求和响应过程。在Servlet技术中,提供了两个⽤于保存会话数据的对象,分别是Cookie和Session。2、Cookie与Session主要有如下区别:1)Cookie和HttpSession是保存会话相关数据的技术,其中Cookie将信息存储在浏览器端,是客户端技术,Session将数据保存在服务器端,是服务器端技术2)Cookie是基于HTTP协议中的Set-Cookie响应头和Cookie请求头进⾏⼯作的3)默认情况下HttpSession是基于⼀个名称为JSESSIONID 的特殊Cookie⼯作的4)浏览器对Cookie具有严格的限制,⼀个⽹站能在浏览器中保存多少Cookie是有限制的5)HttpSession默认是基于Cookie运作的。3、该功能的实现步骤如下:1)创建⼀个LastAccessServlet类,使其继承HttpServlet类并重写该类的doGet()⽅法。2)在doGet()⽅法中,使⽤kies()得到所有cookie形成的cookie数组,并进⾏遍历。3)如果遍历过程中找到cookie信息中存在lastAccess属性则输出,否则创建cookie对象设置值为当前时间并发送给客户端。4)cookie的存活时间为1⼩时,访问当前应⽤中的所有资源客户端都回送cookie信息。(1)LastAccessServlet类的实现代码如下:public class LastAccessServlet extends HttpServlet {private static final long serialVersionUID = 1L;public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {tentType(“text/html;charset=utf-8”);/** 设定⼀个 cookie 的name : lastAccessTime 读取客户端发送cookie* 获得⽤户上次的访问时间显⽰*/String lastAccessTime = null;// 获取所有的cookie,并将这些cookie存放在数组中Cookie[] cookies = kies();for (int i = 0; cookies != null && i < ; i++) {if (“lastAccess”.equals(cookies[i].getName())) {// 如果cookie的名称为lastAccess,则获取该cookie的值lastAccessTime = cookies[i].getValue();break;}}// 判断是否存在名称为lastAccess的cookieif (lastAccessTime == null) {ter().print(“您是⾸次访问本站”);} else {ter().print(“您上次的访问时间” + lastAccessTime);}// 创建cookie,将当前时间作为cookie的值发送给客户端Cookie cookie = new Cookie(“lastAccess”, new Date().toLocaleString());Age(60 * 60);// 保存1⼩时// 访问chapter05下资源时回送h("/chapter05");// 发送 kie(cookie);}}(2)⽂件配置如下:cessServletLastAccessServlet/LastAccessServlet4、该功能的实现代码如下:(1)书籍Book类的创建如下:public class Book implements Serializable {private static final long serialVersionUID = 1L;private String id;private String name;public Book() {}public Book(String id, String name) { = id; = name;}public String getId() {return id;}public void setId(String id) { = id;}public String getName() {return name;}}public void setName(String name) { = name;}}(2)书籍数据库模拟类BookDB的代码如下:private static Map
${1} welcome!!
5、该功能的实现步骤如下:1)直接⽣成Person对象。2)使⽤BeanUtils⼯具为name属性赋值”Tom”,age赋值为31。3)使⽤BeanUtils⼯具取出属性值,并在控制台输出。(1)Person类如下:public class Person {private String name;
private int age;public String getName() {return name;}public void setName(String name) { = name;}public int getAge() {return age;}public void setAge(int age) { = age;}}(2)BeanUtilsDemo01类如下:public class BeanUtilsDemo01 {public static void main(String[] args) throws Exception {Person p = new Person();// 使⽤BeanUtils为属性赋值perty(p, “name”, “Tom”);perty(p, “age”, 31);// 使⽤BeanUtils获取属性值String name = perty(p, “name”);String age = perty(p, “age”);n(“名字是” + name + “,今年” + age + “岁”);}}第⼋章【测⼀测】学习完前⾯的内容,下⾯来动⼿测⼀测吧,请思考以下问题:1、简述过滤器的作⽤。2、简述Servlet事件监听器的作⽤。(写出三点)3、已知有⼀个名为MyServlet的程序,程序可向浏览器输出“Hello MyServlet”。请编写⼀个⽤于拦截MyServlet程序的MyFilter拦截器。要求如下:1)编写名为MyFilter的过滤器,过滤器可向浏览器输出“Hello MyFilter”。2)编写⽂件,配置MyFilter对MyServlet的拦截。4、如何对ServletContext、HttpSession和ServletRequest这三个域对象属性的变更进⾏监听?请⽤代码展⽰。【答案】1、Filter被称作过滤器或者拦截器,其基本功能就是对Servlet容器调⽤Servlet的过程进⾏拦截,从⽽在Servlet进⾏响应处理前后实现⼀些特殊功能。2、Servlet事件监听器的作⽤有如下⼏点:1)监听Web应⽤程序中ServletContext、HttpSession和ServletRequest等域对象的创建和销毁过程。2)监听ServletContext、HttpSession和ServletRequest等域对象属性的修改。3)感知绑定到HttpSession域中某个对象的状态。3、该功能的实现步骤如下:(1)创建MyServlet程序类。import .;import t.;import .;public class MyServlet extends HttpServlet {public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {ter().write("Hello MyServlet ");}public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}(2)创建过滤器MyFilter类。import .;import ;import t.*;public class MyFilter implements Filter {public void destroy() {// 过滤器对象在销毁时⾃动调⽤,释放资源}public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {// ⽤于拦截⽤户的请求,如果和当前过滤器的拦截路径匹配,该⽅法会被调⽤PrintWriter out=ter();(“Hello MyFilter”);}public void init(FilterConfig fConfig) throws ServletException {// 过滤器对象在初始化时调⽤,可以配置⼀些初始化参数}}(3)编写⽂件,设置对MyServlet的拦截letMyServlet/erMyFilter/MyServlet(4)启动服务器后,访问MyServlet,即可查看拦截效果。4、该功能的实现步骤如下:(1)编写⼀个页⾯,以观察各个域对象属性事件监听器的作⽤。<%@ page language=“java” contentType=“text/html; charset=utf-8”pageEncoding=“utf-8”%>这是⼀个测试对象属性信息监听器的页⾯<% getServletContext().setAttribute("username", "itcast"); getServletContext().setAttribute("username", "itheima");getServletContext().removeAttribute("username"); ribute("username", "itcast");ribute("username", "itheima"); Attribute("username"); ribute("username","itcast"); ribute("username", "itheima"); Attribute("username"); %> (2)编写⼀个MyAttributeListener类,该类实现了ServletContextAttributeListener、HttpSessionAttributeListener和ServletRequestAttributeListener接⼝,并实现该接⼝中的所有⽅法。 public class MyAttributeListener implementsServletContextAttributeListener, HttpSessionAttributeListener, ServletRequestAttributeListener { public voidattributeAdded(ServletContextAttributeEvent sae) { String name = e(); n("ServletContext添加属性:" + name + "=" + vletContext().getAttribute(name)); } public voidattributeRemoved(ServletContextAttributeEvent sae) { String name = e(); n("ServletContext移除属性: " + name); } public void attributeReplaced(ServletContextAttributeEvent sae) { String name = e();n("ServletContext替换属性:" + name + "=" + vletContext().getAttribute(name)); } public voidattributeAdded(HttpSessionBindingEvent hbe) { String name = e(); n("HttpSession添加属性:" + name + "=" + sion().getAttribute(name)); } public void attributeRemoved(HttpSessionBindingEventhbe) { String name = e(); n("HttpSession移除属性: " + name); } public voidattributeReplaced(HttpSessionBindingEvent hbe) { String name = e(); n("HttpSession替换属性:" + name + "=" + sion().getAttribute(name)); } public void attributeAdded(ServletRequestAttributeEventsra) { String name = e(); n("ServletRequest添加属性:" + name + "=" +vletRequest().getAttribute(name)); } public void attributeRemoved(ServletRequestAttributeEvent sra) { Stringname = e(); n("ServletRequest移除属性: " + name); } public voidattributeReplaced(ServletRequestAttributeEvent sra) { String name = e(); n("ServletRequest替换属性:" + name + "=" + vletRequest().getAttribute(name)); } } (3)在⽂件中,部署MyAttributeListener事件监听器。 ibuteListener (4)访问页⾯,查看控制台窗⼝的显⽰结果。第九章【测⼀测】学习完前⾯的内容,下⾯来动⼿测⼀测吧,请思考以下问题:1、请简述什么是JDBC。2、简述JDBC的实现步骤。3、请编写⼀个⽤于读取数据库中users表信息的JDBC程序,要求分别获取字段id、name、password和email字段的值。4、请按照以下要求设计实现PreparedStatement对象的相关批处理操作。要求如下:1)指定所要执⾏的SQL语句如下:String sql = “INSERT INTO users(name,password) VALUES(?,?)”;2) 编写JDBCUtils⼯具类,类中要包含获取连接和释放资源的⽅法。3)编写Example02类,要求在类中使⽤JDBCUtils⼯具类获取连接和释放资源,并使⽤PreparedStatement对象批量添加5条记录。【答案】1、JDBC的全称是Java数据库连接(Java Database Connectivity),它是⼀套⽤于执⾏SQL语句的Java API。应⽤程序可通过这套API连接到关系数据库,并使⽤SQL语句来完成对数据库中数据的查询、更新和删除等处理。2、JDBC的实现步骤如下:1)加载并注册数据库驱动2)通过DriverManager获取数据库连接3)通过Connection对象获取Statement对象4)使⽤Statement执⾏SQL语句5)操作ResultSet结果集6)关闭连接,释放资源3、该程序代码如下所⽰:public class Example01 {public static void main(String[] args) throws SQLException {// 1. 注册数据库的驱动erDriver(new ());// 2.通过DriverManager获取数据库连接String url = “jdbc:mysql://localhost:3306/jdbc”;String username = “root”;String password = “itcast”;Connection conn = nection(url, username, password);// 3.通过Connection对象获取Statement对象Statement stmt = Statement();// 4.使⽤Statement执⾏SQL语句。String sql = “select * from users”;ResultSet rs = eQuery(sql);// 5. 操作ResultSet结果集n(“id | name | password | email |”);while (()) {int id = (“id”); // 通过列名获取指定字段的值String name = ing(“name”);String psw = ing(“password”);String email = ing(“email”);n(id + " | " + name + " | " + psw + " | " + email);}// 6.回收数据库资源();();();}}4、该功能的实现步骤如下:(1)JDBCUtils⼯具类的代码如下所⽰:import .*;public class JDBCUtils {// 加载驱动,并建⽴数据库连接public static Connection getConnection() throws SQLException,ClassNotFoundException {e(“”);String url = “jdbc:mysql://localhost:3306/jdbc”;String url = “jdbc:mysql://localhost:3306/jdbc”;String username = “root”;String password = “itcast”;Connection conn = nection(url, username,password);return conn;}// 关闭数据库连接,释放资源public static void release(Statement stmt, Connection conn) {if (stmt != null) {try {();} catch (SQLException e) {tackTrace();}stmt = null;}if (conn != null) {try {();} catch (SQLException e) {tackTrace();}conn = null;}}public static void release(ResultSet rs, Statement stmt,Connection conn){if (rs != null) {try {();} catch (SQLException e) {tackTrace();}rs = null;}release(stmt, conn);}}(2)Example02的代码如下所⽰:public class Example02{public static void main(String[] args) {Connection conn = null;PreparedStatement preStmt = null;try {// 加载并注册数据库驱动conn=nection();String sql = “INSERT INTO users(name,password)VALUES(?,?)”;preStmt = eStatement(sql);for (int i = 0; i < 5; i++) {ing(1, “name” + i);ing(2, “password” + i);ch();}eBatch();} catch (Exception e) {} catch (Exception e) {tackTrace();} finally { // 释放资源e(null, preStmt, conn);}}}第⼗章【测⼀测】学习完前⾯的内容,下⾯来动⼿测⼀测吧,请思考以下问题:1、请思考数据库连接池的⼯作机制是什么?2、简述DriverManager和DataSource中的getConnection()⽅法的区别。3、请按照以下要求设计⼀个程序,⽤于将表中的第⼀条记录相关数据封装到对象数组中。要求如下:1)⾸先向user表中插⼊⼀条记录:INSERT INTO user(id,name,password) VALUES(1,‘zhangsan’,‘123456’);2)已知存在BaseDao 类,且类中存在查询的query(String sql, ResultSetHandler> rsh, Object… params)⽅法。3)编写ResultSetTest类,使⽤ResultSetHandler的相关实现类将查询结果封装到对象数组,并在控制台输出结果。4、请按照以下要求设计⼀个程序,⽤于将表中的所有数据封装到对象数组中。要求如下:1)已知表中的相关记录mysql> SELECT * FROM user;±—±---------±---------+| id | name | password |±—±---------±---------+| 1 | zhangsan | 123456 || 2 | lisi | 123456 || 3 | wangwu | 123456 |±—±---------±---------+2)已知BaseDao 类中存在查询的query(String sql, ResultSetHandler> rsh, Object… params)⽅法。3)编写ResultSetTest2类,使⽤ResultSetHandler的相关实现类将表中的所有记录封装到对象数组,并在控制台输出结果。【答案】1、数据库连接池在初始化时将创建⼀定数量的数据库连接放到连接池中,当应⽤程序访问数据库时并不是直接创建Connection,⽽是向连接池“申请”⼀个Connection。如果连接池中有空闲的Connection,则将其返回,否则创建新的Connection。使⽤完毕后,连接池会将该Connection回收,并交付其他的线程使⽤,以减少创建和断开数据库连接的次数,提⾼数据库的访问效率。2、DriverManager和DataSource中的getConnection()⽅法的区别如下:1)DriverManager每次调⽤getConnection⽅法都会初始化⼀个新的连接,⽽DataSource的getConnection只是从池中取出⼀个已存在的连接2)DriverManager的close()是释放Connection,⽽DataSource的close()只会把Connection归还给连接池。3、ResultSetTest类的实现代码如下:public class ResultSetTest {public static void testArrayHandler() throws SQLException {BaseDao basedao = new BaseDao();String sql = “select * from user where id=?”;Object[] arr = (Object[]) (sql, new ArrayHandler(),new Object[] { 1 });for (int i = 0; i < ; i++) {(arr[i] + ", ");}}public static void main(String[] args) throws SQLException {testArrayHandler();}}4、ResultSetTest2类的实现代码如下:public class ResultSetTest2 {public static void testArrayListHandler() throws SQLException {BaseDao basedao = new BaseDao();String sql = “select * from user”;List list = (List) (sql, new ArrayListHandler());Object[] arr = (Object[]) (0);Object[] arr1 = (Object[]) (1);Object[] arr2 = (Object[]) (2);for (int i = 0; i < ; i++) {(arr[i] + ", ");}for (int i = 0; i < ; i++) {(arr1[i] + ", ");}for (int i = 0; i < ; i++) {(arr2[i] + ", ");}}public static void main(String[] args) throws SQLException {testArrayListHandler();}}第⼗⼀章【测⼀测】学习完前⾯的内容,下⾯来动⼿测⼀测吧,请思考以下问题:1、简述什么是MVC设计模式。2、简述MVC设计模式中模型(Model)模块的作⽤。【答案】1、MVC设计模式是编程语⾔的⼀种软件设计模式,提供了⼀种按功能对软件进⾏模块划分的⽅法。MVC设计模式将软件程序分为三个核⼼模块:模型(Model)、视图(View)和控制器(Controller)。2、MVC设计模式中模型(Model)模块的作⽤如下:1)管理应⽤程序的业务数据。2)定义访问控制和修改这些数据的业务规则。3)当模型的状态发⽣改变时,它会通知视图发⽣改变,并为视图提供查询模型状态的⽅法。第⼗⼆章【测⼀测】学习完前⾯的内容,下⾯来动⼿测⼀测吧,请思考以下问题:1、请编写⼀个⽤于实现⽂件下载的程序,并且保证下载⽂件的⽂件名不能出现中⽂乱码问题。2、请按照以下要求设计⼀个实现⽂件上传的类UploadServlet。要求如下:1)已知⽂件中form表单内定义了⼀个名为name的⽂本框及名为myfile的⽂件域,具备⽂件上传的前提条件。2)在doPost()⽅法中,写出⽂件上传的相关代码。3)上传的⽂件保存在当前应⽤程序的upload⽂件夹下。3、 实现⽂件上传的表单页⾯都需要哪些配置?4、简述⽂件下载的实现原理。【答案】1、该功能的实现步骤如下:(1)创建下载页⾯。<%@ page language=“java” import=“.*” pageEncoding=“UTF-8”%>2、UploadServlet代码如下:public class UploadServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {tentType(“text/html;charset=utf-8”);try {// 创建⼯⼚DiskFileItemFactory factory = new DiskFileItemFactory();ository(new File(“e:Target”));// 创建 fileupload 组件ServletFileUpload fileupload = new ServletFileUpload(factory);derEncoding(“utf-8”);// 解析 requestList fileitems = equest(request);PrintWriter writer = ter();// 遍历集合for (FileItem fileitem : fileitems) {// 判断是否为普通字段if (Field()) {// 获得字段名和字段值String name = ldName();String value = ing(“utf-8”);} else {// 上传的⽂件路径String filename = e();(“⽂件来源:” + filename + “”);// 截取出⽂件名filename = ing(dexOf("") + 1);(“成功上传的⽂件:” + filename + “”);// ⽂件名需要唯⼀filename = UUID().toString() + “_” + filename;// 在服务器创建同名⽂件String webPath = “/upload/” + filename;String path = getServletContext().getRealPath(webPath);// 创建⽂件File file = new File(path);entFile().mkdirs();NewFile();// 获得上传⽂件流InputStream in = utStream();// 获得写⼊⽂件流OutputStream out = new FileOutputStream(file);// 流的对拷byte[] buffer = new byte[1024];int len;while ((len = (buffer)) > 0)(buffer, 0, len);// 关流();();// 删除临时⽂件();}}} catch (Exception e) {} catch (Exception e) {throw new RuntimeException(e);}}1234}3、实现⽂件上传的表单页⾯需要配置如下:1)⾸先要创建⼀个⽤于提交上传⽂件的表单页⾯。2)在页⾯中,需要使⽤标签在Web页⾯中添加⽂件上传输⼊项。3)必须要设置input输⼊项的name属性,否则浏览器将不会发送上传⽂件的数据。4)必须把将表单页⾯的method属性设置为post⽅式,enctype属性设置为“multipart/form-data”类型。4、⾸先获取下载⽂件的地址,并根据该地址创建⽂件字节输⼊流,然后通过该流读取下载⽂件内容,最后将读取的内容通过输出流写到⽬标⽂件中。第⼗三章【测⼀测】学习完前⾯的内容,下⾯来动⼿测⼀测吧,请思考以下问题:1、请描述传智书城项⽬的开发环境。2、请写出传智书城项⽬搭建所需要导⼊的jar包。3、请按照以下要求写出⽂件的配置。信息如下:1)数据库名itcaststore。2)⽤户名root。3)密码itcast。4、请按照要求写出数据源⼯具类。要求如下:1)⼯具类名为DataSourceUtils。2)⼯具类提供获取Connection对象、开启事务、提交事务、回滚事务。【答案】1、传智书城项⽬的开发环境如下:1)操作系统:Windows XP、Windows 7或更⾼的Windows版本。2)Web服务器:Tomcat7.0。3)Java开发包:JDK1.7。4)数据库:MySQL5.5。5)开发⼯具:Eclipse Java EE IDE for Web Developers。6)浏览器:IE8.0或更⾼版本。2、传智书城项⽬搭建所需要导⼊的jar包如下:1)2)3)4)5)6)7)8)9)10)3、⽂件的配置如下: root itcast jdbc:mysql:///itcaststorepublic void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response);} root itcast jdbc:mysql:///itcaststore4、数据源⼯具类DataSourceUtils实现代码如下:package ;import tion;import eption;import urce;import ooledDataSource;public class DataSourceUtils {private static DataSource dataSource = new ComboPooledDataSource();private static ThreadLocal tl = new ThreadLocal();public static DataSource getDataSource() {return dataSource;}/*** 当DBUtils需要⼿动控制事务时,调⽤该⽅法获得⼀个连接** @return* @throws SQLException/public static Connection getConnection() throws SQLException {Connection con = ();if (con == null) {con = nection();(con);}return con;}/** 开启事务** @throws SQLException/public static void startTransaction() throws SQLException {Connection con = getConnection();if (con != null)oCommit(false);}/** 从ThreadLocal中释放并且关闭Connection,并结束事务** @throws SQLException/public static void releaseAndCloseConnection() throws SQLException {Connection con = getConnection();if (con != null) {();();();}}/** 事务回滚* @throws SQLException*/public static void rollback() throws SQLException {Connection con = getConnection();Connection con = getConnection();if (con != null) {ck();}}}第⼗四章【测⼀测】学习完前⾯的内容,下⾯来动⼿测⼀测吧,请思考以下问题:1、请简要描述注册功能的设计思路。2、请简要描述购物车模块的设计思路。【答案】1、当新⽤户⾸次访问该⽹站时,需要先注册账号。在注册页⾯中新⽤户需要填写有邮箱、⽤户名、密码、重复密码、性别、联系电话、个⼈介绍以及验证码。⾸先对填写的注册信息进⾏校验,⽐如⽤户名和密码不能为空;密码和重复密码表单输⼊的内容必须⼀致;输⼊的邮箱地址应该是合法的等。然后查询数据库判断⽤户名是否存在。如果存在,则注册失败。如果不存在,则注册成功。2、当⽤户选择商品时,⾸先需要校验此⽤户是否登陆,如果未登录则提⽰⽤户登录,如果已经登陆则将商品添加⾄购物车,此时购物车中如已经有此商品,则商品数量加⼀,否则创建此商品。商品添加后可选择是继续购物、清空购物车还是进⾏结算,如果进⾏结算则让⽤户填写订单信息,之后⽣成订单,让⽤户完成在线⽀付。第⼗五章【测⼀测】学习完前⾯的内容,下⾯来动⼿测⼀测吧,请思考以下问题:1、请简要描述⼀下商品管理模块的设计思路和实现流程。2、请简要描述⼀下销量榜单下载功能的设计思路和实现流程。【答案】1、 商品管理模块主要的功能包括查询商品信息、添加商品信息、编辑商品信息和删除商品信息这4个功能。查询商品信息时可通过条件查询也可以查询所⽤商品。查询之后可进⼊商品列表页⾯,在此页⾯中提供了增加、修改和删除商品信息的功能。单击添加按钮,打开商品添加页⾯,填写商品信息之后,单击确定按钮后,新添加的商品信息即可在列表页⾯中显⽰出来。单击商品列表中修改按钮,页⾯会跳转到该商品的编辑页⾯,修改其中显⽰出商品的具体信息之后,单击保存按钮,商品管理⾸页将显⽰修改后的商品信息。单击列表页⾯中商品后⾯的删除按钮,会提⽰是否删除,确定删除后,系统会将此条商品信息删除,商品管理⾸页将不再显⽰此信息。2、模块主要实现的功能是下载历史销售数据,将已销售商品的信息,按照商品销量从⾼到低排序后导出到扩展名为“.csv”的⽂件中(csv⽂件即逗号分隔值⽂件格式,通常是纯⽂本⽂件)。下载销售数据时可以填写年份和⽉份这两个查询条件,在年份输⼊框和⽉份下拉框中分别填写相应信息,然后单击“下载”按钮,会弹出⽂件下载提⽰框,在提⽰框中选择⽂件的下载⽬录,单击“确定”后就可以将指定年份和⽉份的销售历史数据下载到⽂件中。
2023年6月20日发(作者:)
⿊马程序员《JavaWeb程序设计案例教程》_课后习题答案第⼀章【测⼀测】学习完前⾯的内容,下⾯来动⼿测⼀测吧,请思考以下问题:1、请描述HTML、CSS、DOM、JavaScript分别表⽰的含义。2、请列举出HTML常⽤的标记。(⾄少10个)3、请编写出⼀个HTML页⾯,令其输出“hello world!~~”,使⽤css将其字体设置为宋体红⾊。4、编写⼀个HTML页⾯,页⾯包含数字和按钮两部分,每次单击按钮可以使数字加⼀。【答案】1、HTML:HTML是英⽂Hyper Text Markup Language的缩写,中⽂译为“超⽂本标记语⾔”,其主要作⽤是通过HTML标记对⽹页中的⽂本、图⽚、声⾳等内容进⾏描述。CSS:CSS 是 Cascading Style Sheet 的缩写,译作“层叠样式表单”,是⽤于(增强)控制⽹页样式并允许将样式信息与⽹页内容分离的⼀种标记性语⾔。DOM:DOM是Document Object Model(⽂档对象模型)的简称,是W3C组织推荐的处理可扩展标志语⾔的标准编程接⼝,它可以以⼀种独⽴于平台和语⾔的⽅式访问和修改⼀个⽂档的内容和结构。JavaScript:JavaScript是Web中⼀种功能强⼤的脚本语⾔,被设计为向 HTML 页⾯增加交互性,常⽤来为⽹页添加各式各样的动态功能,它不需要进⾏编译,直接嵌⼊在HTML页⾯中,就可以把静态的页⾯转变成⽀持⽤户交互并响应事件的动态页⾯。2、HTML常⽤的标记有:1)2)3)4)
5)
6)7)
8)
9)10)3、HTML页⾯代码如下:hello world!~~
hello world!~~4、HTML页⾯代码如下:第⼆章【测⼀测】学习完前⾯的内容,下⾯来动⼿测⼀测吧,请思考以下问题:1、简述HTTP1.1协议的通信过程?2、简述POST请求和GET请求有什么不同?(⾄少2点)3、请列举出Tomcat安装⽬录下的⼦⽬录,并对其进⾏简要说明?(⾄少列出5个)4、请编写⼀个格式良好的XML⽂档,要求包含⾜球队⼀⽀,队名为Madrid,球员5⼈:Ronaldo、Casillas、Ramos、Modric、Benzema;篮球队⼀⽀,队名为Lakers,队员2⼈:Oneal,Bryant。⾥⾯要求含有注释,注释内容⾃定。【答案】1、HTTP1.1协议的通信过程如下:1. 客户端与服务器端建⽴TCP连接。2. 客户端可以向服务器端发送多个请求,并且在发送下个请求时,⽆需等待上次请求的返回结果。3. 服务器必须按照接受客户端请求的先后顺序依次返回响应结果。4)客户端发出关闭TCP连接的请求。4. 服务器端关闭TCP连接。2、POST请求和GET请求主要有如下不同:1. POST传输数据⼤⼩⽆限制2. POST⽐GET请求⽅式更安全3、Tomcat安装⽬录下的⼦⽬录及其说明如下:bin:⽤于存放Tomcat的可执⾏⽂件和脚本⽂件(扩展名为.bat的⽂件),如、;conf:⽤于存放Tomcat的各种配置⽂件,如、;lib:⽤于存放Tomcat服务器和所有Web应⽤程序需要访问的JAR⽂件;logs:⽤于存放Tomcat的⽇志⽂件;temp:⽤于存放Tomcat运⾏时产⽣的临时⽂件;webapps:Web应⽤程序的主要发布⽬录,通常将要发布的应⽤程序放到这个⽬录下;work:Tomcat的⼯作⽬录,JSP编译⽣成的Servlet源⽂件和字节码⽂件放到这个⽬录下。4、XML页⾯代码如下:<球队列表><球队 类型=“⾜球队”><队名>Madrid队名><队员><姓名>Ronaldo姓名><姓名>Casillas姓名><姓名>Ramos姓名><姓名>Modric姓名><姓名>Benzema姓名>队员>球队><球队 类型=“篮球队”><队名>Lakers队名><队员><姓名>Oneal姓名><姓名>Bryant姓名>队员>球队>球队列表>第三章【测⼀测】学习完前⾯的内容,下⾯来动⼿测⼀测吧,请思考以下问题:1、请列举Servlet接⼝中的⽅法,并分别说明这些⽅法的特点及其作⽤。2、简述ServletContext接⼝的三个主要作⽤。3、编写⼀个servlet,实现统计⽹站被访问次数的功能。4、请编写⼀段程序,使程序能读取该servlet的配置信息,从中获得参数名为encoding对应的参数值,并输出到页⾯上。【答案】1、Servlet接⼝中有init、service、destroy 、getServletConfig和getServletInfo这 5个⽅法,这些⽅法的特点及其作⽤具体如下:1)init(ServletConfig config)⽅法,该⽅法在服务器对Servlet第⼀次访问时调⽤,负责Servlet初始化⼯作。在⼀个Servlet的⽣命周期中只执⾏⼀次。该⽅法接收⼀个ServletConfig类型的参数,Servlet容器可以通过这个参数向Servlet传递初始化配置信息。2)service(ServletRequest request,ServletResponse response)⽅法,该⽅法负责响应⽤户的请求,当容器接收到客户端访问Servlet对象的请求时,就会调⽤此⽅法。3)destroy()⽅法,该⽅法⽅法负责释放Servlet对象占⽤的资源。当Servlet对象被销毁时,容器会调⽤此⽅法。4)getServletConfig()⽅法,该⽅法返回容器调⽤init(ServletConfig config)⽅法时传递给Servlet的ServletConfig对象。5)getServletInfo()⽅法,该⽅法返回⼀个字符串,其中包含了关于Servlet的信息,例如,作者、版本和版权等信息。2、ServletContext接⼝的三个主要作⽤如下:1)获取Web应⽤程序的初始化参数2)实现多个Servlet对象共享数据3)读取Web应⽤下的资源⽂件3、实现步骤如下:1)新建⼀个类ShowTimesServlet继承HttpServlet,重写doGet和doPost⽅法2)在doPost⽅法中调⽤doGet⽅法,在doGet⽅法中实现统计⽹站被访问次数的功能,⽤户每请求⼀次Servlet,使访问次数times加13)获取ServletContext,通过它的功能记住上⼀次访问后的次数(1)ShowTimesServlet类的编写如下:public class ShowTimesServlet extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {ServletContext context = getServletContext();Integer times = (Integer) ribute(“times”);if (times == null) {times = new Integer(1);} else {times = new Integer(ue() + 1);}//设置编码,不然中⽂会变成乱码tentType(“text/html;charset=GB2312”);//得到输出流对象PrintWriter out=ter();n("");n(“当前页⾯被访问了”);n(""+times+“次”);//设置属性,将times保存到当前的上下⽂中ribute(“times”,times);}protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {(req, resp);}}(2)配置信息如下:mesServletShowTimesServlet/ShowTimesServlet4、实现代码如下:(1)TestServlet类如下:public class TestServlet extends HttpServlet {protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {PrintWriter out = ter();// 获得ServletConfig对象ServletConfig config = vletConfig();// 获得参数名为encoding对应的参数值String param = tParameter(“encoding”);n(“encoding=” + param);}protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {(request, response);}}(2)⽂件配置如下:rvletencodingUTF-8TestServlet/TestServlet第四章【测⼀测】学习完前⾯的内容,下⾯来动⼿测⼀测吧,请思考以下问题:1、简述请求转发与重定向的异同?(⾄少写3点)2、请写出禁⽌浏览器缓存页⾯的核⼼代码。3、请编写⼀个类,该类能够实现访问完app应⽤下的Servlet后,还能在浏览器地址栏中显⽰出的路径。4、请编写⼀个类,该类使⽤HttpServletRequest对象的getHeader(“referer”)⽅法实现下载资源防盗链的功能。【答案】1、请求转发与重定向的异同点如下:1)请求转发和重定向都可以实现访问⼀个资源时转向当前应⽤资源2)请求转发是⼀次请求⼀次响应,⽽重定向为两次请求两次响应3)⼀般情况下应该使⽤请求转发,减少浏览器对服务器的访问,减轻服务器压⼒4)如果需要改变浏览器的地址栏,或更改浏览器的刷新按钮的功能时需要使⽤重定向2、禁⽌浏览器缓存页⾯的核⼼代码如下:eHeader(“Expires”,0);der(“Cache-Control”,“no-cache”);der(“Pragma”,“no-cache”);3、实现代码如下:(1)MyServlet程序类如下:public class MyServlet extends HttpServlet {protected void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {n(“这⾥是MyServlet!”);direct(textPath() + “/”);}}(2)⽂件配置如下:letMyServlet/MyServlet第五章【测⼀测】学习完前⾯的内容,下⾯来动⼿测⼀测吧,请思考以下问题:1、简述什么是会话技术?2、简述Cookie与Session的区别?(⾄少写出3点)3、请设计⼀个类,使⽤Cookie技术实现显⽰⽤户上次访问时间的功能。要求如下:1)创建⼀个LastAccessServlet类,使其继承HttpServlet类并重写该类的doGet()⽅法。2)在doGet()⽅法中,使⽤kies()得到所有cookie形成的cookie数组,并进⾏遍历。3)如果遍历过程中找到cookie信息中存在lastAccess属性则输出,否则创建cookie对象设置值为当前时间并发送给客户端。4)cookie的存活时间为1⼩时,访问当前应⽤中的所有资源客户端都回送cookie信息。4、请设计⼀个程序,使⽤Session技术实现购物车功能。【答案】1、会话过程类似于⽣活中的打电话过程,它指的是⼀个客户端(浏览器)与Web服务器之间连续发⽣的⼀系列请求和响应过程。在Servlet技术中,提供了两个⽤于保存会话数据的对象,分别是Cookie和Session。2、Cookie与Session主要有如下区别:1)Cookie和HttpSession是保存会话相关数据的技术,其中Cookie将信息存储在浏览器端,是客户端技术,Session将数据保存在服务器端,是服务器端技术2)Cookie是基于HTTP协议中的Set-Cookie响应头和Cookie请求头进⾏⼯作的3)默认情况下HttpSession是基于⼀个名称为JSESSIONID 的特殊Cookie⼯作的4)浏览器对Cookie具有严格的限制,⼀个⽹站能在浏览器中保存多少Cookie是有限制的5)HttpSession默认是基于Cookie运作的。3、该功能的实现步骤如下:1)创建⼀个LastAccessServlet类,使其继承HttpServlet类并重写该类的doGet()⽅法。2)在doGet()⽅法中,使⽤kies()得到所有cookie形成的cookie数组,并进⾏遍历。3)如果遍历过程中找到cookie信息中存在lastAccess属性则输出,否则创建cookie对象设置值为当前时间并发送给客户端。4)cookie的存活时间为1⼩时,访问当前应⽤中的所有资源客户端都回送cookie信息。(1)LastAccessServlet类的实现代码如下:public class LastAccessServlet extends HttpServlet {private static final long serialVersionUID = 1L;public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {tentType(“text/html;charset=utf-8”);/** 设定⼀个 cookie 的name : lastAccessTime 读取客户端发送cookie* 获得⽤户上次的访问时间显⽰*/String lastAccessTime = null;// 获取所有的cookie,并将这些cookie存放在数组中Cookie[] cookies = kies();for (int i = 0; cookies != null && i < ; i++) {if (“lastAccess”.equals(cookies[i].getName())) {// 如果cookie的名称为lastAccess,则获取该cookie的值lastAccessTime = cookies[i].getValue();break;}}// 判断是否存在名称为lastAccess的cookieif (lastAccessTime == null) {ter().print(“您是⾸次访问本站”);} else {ter().print(“您上次的访问时间” + lastAccessTime);}// 创建cookie,将当前时间作为cookie的值发送给客户端Cookie cookie = new Cookie(“lastAccess”, new Date().toLocaleString());Age(60 * 60);// 保存1⼩时// 访问chapter05下资源时回送h("/chapter05");// 发送 kie(cookie);}}(2)⽂件配置如下:cessServletLastAccessServlet/LastAccessServlet4、该功能的实现代码如下:(1)书籍Book类的创建如下:public class Book implements Serializable {private static final long serialVersionUID = 1L;private String id;private String name;public Book() {}public Book(String id, String name) { = id; = name;}public String getId() {return id;}public void setId(String id) { = id;}public String getName() {return name;}}public void setName(String name) { = name;}}(2)书籍数据库模拟类BookDB的代码如下:private static Map
${1} welcome!!
5、该功能的实现步骤如下:1)直接⽣成Person对象。2)使⽤BeanUtils⼯具为name属性赋值”Tom”,age赋值为31。3)使⽤BeanUtils⼯具取出属性值,并在控制台输出。(1)Person类如下:public class Person {private String name;
private int age;public String getName() {return name;}public void setName(String name) { = name;}public int getAge() {return age;}public void setAge(int age) { = age;}}(2)BeanUtilsDemo01类如下:public class BeanUtilsDemo01 {public static void main(String[] args) throws Exception {Person p = new Person();// 使⽤BeanUtils为属性赋值perty(p, “name”, “Tom”);perty(p, “age”, 31);// 使⽤BeanUtils获取属性值String name = perty(p, “name”);String age = perty(p, “age”);n(“名字是” + name + “,今年” + age + “岁”);}}第⼋章【测⼀测】学习完前⾯的内容,下⾯来动⼿测⼀测吧,请思考以下问题:1、简述过滤器的作⽤。2、简述Servlet事件监听器的作⽤。(写出三点)3、已知有⼀个名为MyServlet的程序,程序可向浏览器输出“Hello MyServlet”。请编写⼀个⽤于拦截MyServlet程序的MyFilter拦截器。要求如下:1)编写名为MyFilter的过滤器,过滤器可向浏览器输出“Hello MyFilter”。2)编写⽂件,配置MyFilter对MyServlet的拦截。4、如何对ServletContext、HttpSession和ServletRequest这三个域对象属性的变更进⾏监听?请⽤代码展⽰。【答案】1、Filter被称作过滤器或者拦截器,其基本功能就是对Servlet容器调⽤Servlet的过程进⾏拦截,从⽽在Servlet进⾏响应处理前后实现⼀些特殊功能。2、Servlet事件监听器的作⽤有如下⼏点:1)监听Web应⽤程序中ServletContext、HttpSession和ServletRequest等域对象的创建和销毁过程。2)监听ServletContext、HttpSession和ServletRequest等域对象属性的修改。3)感知绑定到HttpSession域中某个对象的状态。3、该功能的实现步骤如下:(1)创建MyServlet程序类。import .;import t.;import .;public class MyServlet extends HttpServlet {public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {ter().write("Hello MyServlet ");}public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}(2)创建过滤器MyFilter类。import .;import ;import t.*;public class MyFilter implements Filter {public void destroy() {// 过滤器对象在销毁时⾃动调⽤,释放资源}public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {// ⽤于拦截⽤户的请求,如果和当前过滤器的拦截路径匹配,该⽅法会被调⽤PrintWriter out=ter();(“Hello MyFilter”);}public void init(FilterConfig fConfig) throws ServletException {// 过滤器对象在初始化时调⽤,可以配置⼀些初始化参数}}(3)编写⽂件,设置对MyServlet的拦截letMyServlet/erMyFilter/MyServlet(4)启动服务器后,访问MyServlet,即可查看拦截效果。4、该功能的实现步骤如下:(1)编写⼀个页⾯,以观察各个域对象属性事件监听器的作⽤。<%@ page language=“java” contentType=“text/html; charset=utf-8”pageEncoding=“utf-8”%>这是⼀个测试对象属性信息监听器的页⾯<% getServletContext().setAttribute("username", "itcast"); getServletContext().setAttribute("username", "itheima");getServletContext().removeAttribute("username"); ribute("username", "itcast");ribute("username", "itheima"); Attribute("username"); ribute("username","itcast"); ribute("username", "itheima"); Attribute("username"); %> (2)编写⼀个MyAttributeListener类,该类实现了ServletContextAttributeListener、HttpSessionAttributeListener和ServletRequestAttributeListener接⼝,并实现该接⼝中的所有⽅法。 public class MyAttributeListener implementsServletContextAttributeListener, HttpSessionAttributeListener, ServletRequestAttributeListener { public voidattributeAdded(ServletContextAttributeEvent sae) { String name = e(); n("ServletContext添加属性:" + name + "=" + vletContext().getAttribute(name)); } public voidattributeRemoved(ServletContextAttributeEvent sae) { String name = e(); n("ServletContext移除属性: " + name); } public void attributeReplaced(ServletContextAttributeEvent sae) { String name = e();n("ServletContext替换属性:" + name + "=" + vletContext().getAttribute(name)); } public voidattributeAdded(HttpSessionBindingEvent hbe) { String name = e(); n("HttpSession添加属性:" + name + "=" + sion().getAttribute(name)); } public void attributeRemoved(HttpSessionBindingEventhbe) { String name = e(); n("HttpSession移除属性: " + name); } public voidattributeReplaced(HttpSessionBindingEvent hbe) { String name = e(); n("HttpSession替换属性:" + name + "=" + sion().getAttribute(name)); } public void attributeAdded(ServletRequestAttributeEventsra) { String name = e(); n("ServletRequest添加属性:" + name + "=" +vletRequest().getAttribute(name)); } public void attributeRemoved(ServletRequestAttributeEvent sra) { Stringname = e(); n("ServletRequest移除属性: " + name); } public voidattributeReplaced(ServletRequestAttributeEvent sra) { String name = e(); n("ServletRequest替换属性:" + name + "=" + vletRequest().getAttribute(name)); } } (3)在⽂件中,部署MyAttributeListener事件监听器。 ibuteListener (4)访问页⾯,查看控制台窗⼝的显⽰结果。第九章【测⼀测】学习完前⾯的内容,下⾯来动⼿测⼀测吧,请思考以下问题:1、请简述什么是JDBC。2、简述JDBC的实现步骤。3、请编写⼀个⽤于读取数据库中users表信息的JDBC程序,要求分别获取字段id、name、password和email字段的值。4、请按照以下要求设计实现PreparedStatement对象的相关批处理操作。要求如下:1)指定所要执⾏的SQL语句如下:String sql = “INSERT INTO users(name,password) VALUES(?,?)”;2) 编写JDBCUtils⼯具类,类中要包含获取连接和释放资源的⽅法。3)编写Example02类,要求在类中使⽤JDBCUtils⼯具类获取连接和释放资源,并使⽤PreparedStatement对象批量添加5条记录。【答案】1、JDBC的全称是Java数据库连接(Java Database Connectivity),它是⼀套⽤于执⾏SQL语句的Java API。应⽤程序可通过这套API连接到关系数据库,并使⽤SQL语句来完成对数据库中数据的查询、更新和删除等处理。2、JDBC的实现步骤如下:1)加载并注册数据库驱动2)通过DriverManager获取数据库连接3)通过Connection对象获取Statement对象4)使⽤Statement执⾏SQL语句5)操作ResultSet结果集6)关闭连接,释放资源3、该程序代码如下所⽰:public class Example01 {public static void main(String[] args) throws SQLException {// 1. 注册数据库的驱动erDriver(new ());// 2.通过DriverManager获取数据库连接String url = “jdbc:mysql://localhost:3306/jdbc”;String username = “root”;String password = “itcast”;Connection conn = nection(url, username, password);// 3.通过Connection对象获取Statement对象Statement stmt = Statement();// 4.使⽤Statement执⾏SQL语句。String sql = “select * from users”;ResultSet rs = eQuery(sql);// 5. 操作ResultSet结果集n(“id | name | password | email |”);while (()) {int id = (“id”); // 通过列名获取指定字段的值String name = ing(“name”);String psw = ing(“password”);String email = ing(“email”);n(id + " | " + name + " | " + psw + " | " + email);}// 6.回收数据库资源();();();}}4、该功能的实现步骤如下:(1)JDBCUtils⼯具类的代码如下所⽰:import .*;public class JDBCUtils {// 加载驱动,并建⽴数据库连接public static Connection getConnection() throws SQLException,ClassNotFoundException {e(“”);String url = “jdbc:mysql://localhost:3306/jdbc”;String url = “jdbc:mysql://localhost:3306/jdbc”;String username = “root”;String password = “itcast”;Connection conn = nection(url, username,password);return conn;}// 关闭数据库连接,释放资源public static void release(Statement stmt, Connection conn) {if (stmt != null) {try {();} catch (SQLException e) {tackTrace();}stmt = null;}if (conn != null) {try {();} catch (SQLException e) {tackTrace();}conn = null;}}public static void release(ResultSet rs, Statement stmt,Connection conn){if (rs != null) {try {();} catch (SQLException e) {tackTrace();}rs = null;}release(stmt, conn);}}(2)Example02的代码如下所⽰:public class Example02{public static void main(String[] args) {Connection conn = null;PreparedStatement preStmt = null;try {// 加载并注册数据库驱动conn=nection();String sql = “INSERT INTO users(name,password)VALUES(?,?)”;preStmt = eStatement(sql);for (int i = 0; i < 5; i++) {ing(1, “name” + i);ing(2, “password” + i);ch();}eBatch();} catch (Exception e) {} catch (Exception e) {tackTrace();} finally { // 释放资源e(null, preStmt, conn);}}}第⼗章【测⼀测】学习完前⾯的内容,下⾯来动⼿测⼀测吧,请思考以下问题:1、请思考数据库连接池的⼯作机制是什么?2、简述DriverManager和DataSource中的getConnection()⽅法的区别。3、请按照以下要求设计⼀个程序,⽤于将表中的第⼀条记录相关数据封装到对象数组中。要求如下:1)⾸先向user表中插⼊⼀条记录:INSERT INTO user(id,name,password) VALUES(1,‘zhangsan’,‘123456’);2)已知存在BaseDao 类,且类中存在查询的query(String sql, ResultSetHandler> rsh, Object… params)⽅法。3)编写ResultSetTest类,使⽤ResultSetHandler的相关实现类将查询结果封装到对象数组,并在控制台输出结果。4、请按照以下要求设计⼀个程序,⽤于将表中的所有数据封装到对象数组中。要求如下:1)已知表中的相关记录mysql> SELECT * FROM user;±—±---------±---------+| id | name | password |±—±---------±---------+| 1 | zhangsan | 123456 || 2 | lisi | 123456 || 3 | wangwu | 123456 |±—±---------±---------+2)已知BaseDao 类中存在查询的query(String sql, ResultSetHandler> rsh, Object… params)⽅法。3)编写ResultSetTest2类,使⽤ResultSetHandler的相关实现类将表中的所有记录封装到对象数组,并在控制台输出结果。【答案】1、数据库连接池在初始化时将创建⼀定数量的数据库连接放到连接池中,当应⽤程序访问数据库时并不是直接创建Connection,⽽是向连接池“申请”⼀个Connection。如果连接池中有空闲的Connection,则将其返回,否则创建新的Connection。使⽤完毕后,连接池会将该Connection回收,并交付其他的线程使⽤,以减少创建和断开数据库连接的次数,提⾼数据库的访问效率。2、DriverManager和DataSource中的getConnection()⽅法的区别如下:1)DriverManager每次调⽤getConnection⽅法都会初始化⼀个新的连接,⽽DataSource的getConnection只是从池中取出⼀个已存在的连接2)DriverManager的close()是释放Connection,⽽DataSource的close()只会把Connection归还给连接池。3、ResultSetTest类的实现代码如下:public class ResultSetTest {public static void testArrayHandler() throws SQLException {BaseDao basedao = new BaseDao();String sql = “select * from user where id=?”;Object[] arr = (Object[]) (sql, new ArrayHandler(),new Object[] { 1 });for (int i = 0; i < ; i++) {(arr[i] + ", ");}}public static void main(String[] args) throws SQLException {testArrayHandler();}}4、ResultSetTest2类的实现代码如下:public class ResultSetTest2 {public static void testArrayListHandler() throws SQLException {BaseDao basedao = new BaseDao();String sql = “select * from user”;List list = (List) (sql, new ArrayListHandler());Object[] arr = (Object[]) (0);Object[] arr1 = (Object[]) (1);Object[] arr2 = (Object[]) (2);for (int i = 0; i < ; i++) {(arr[i] + ", ");}for (int i = 0; i < ; i++) {(arr1[i] + ", ");}for (int i = 0; i < ; i++) {(arr2[i] + ", ");}}public static void main(String[] args) throws SQLException {testArrayListHandler();}}第⼗⼀章【测⼀测】学习完前⾯的内容,下⾯来动⼿测⼀测吧,请思考以下问题:1、简述什么是MVC设计模式。2、简述MVC设计模式中模型(Model)模块的作⽤。【答案】1、MVC设计模式是编程语⾔的⼀种软件设计模式,提供了⼀种按功能对软件进⾏模块划分的⽅法。MVC设计模式将软件程序分为三个核⼼模块:模型(Model)、视图(View)和控制器(Controller)。2、MVC设计模式中模型(Model)模块的作⽤如下:1)管理应⽤程序的业务数据。2)定义访问控制和修改这些数据的业务规则。3)当模型的状态发⽣改变时,它会通知视图发⽣改变,并为视图提供查询模型状态的⽅法。第⼗⼆章【测⼀测】学习完前⾯的内容,下⾯来动⼿测⼀测吧,请思考以下问题:1、请编写⼀个⽤于实现⽂件下载的程序,并且保证下载⽂件的⽂件名不能出现中⽂乱码问题。2、请按照以下要求设计⼀个实现⽂件上传的类UploadServlet。要求如下:1)已知⽂件中form表单内定义了⼀个名为name的⽂本框及名为myfile的⽂件域,具备⽂件上传的前提条件。2)在doPost()⽅法中,写出⽂件上传的相关代码。3)上传的⽂件保存在当前应⽤程序的upload⽂件夹下。3、 实现⽂件上传的表单页⾯都需要哪些配置?4、简述⽂件下载的实现原理。【答案】1、该功能的实现步骤如下:(1)创建下载页⾯。<%@ page language=“java” import=“.*” pageEncoding=“UTF-8”%>2、UploadServlet代码如下:public class UploadServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {tentType(“text/html;charset=utf-8”);try {// 创建⼯⼚DiskFileItemFactory factory = new DiskFileItemFactory();ository(new File(“e:Target”));// 创建 fileupload 组件ServletFileUpload fileupload = new ServletFileUpload(factory);derEncoding(“utf-8”);// 解析 requestList fileitems = equest(request);PrintWriter writer = ter();// 遍历集合for (FileItem fileitem : fileitems) {// 判断是否为普通字段if (Field()) {// 获得字段名和字段值String name = ldName();String value = ing(“utf-8”);} else {// 上传的⽂件路径String filename = e();(“⽂件来源:” + filename + “”);// 截取出⽂件名filename = ing(dexOf("") + 1);(“成功上传的⽂件:” + filename + “”);// ⽂件名需要唯⼀filename = UUID().toString() + “_” + filename;// 在服务器创建同名⽂件String webPath = “/upload/” + filename;String path = getServletContext().getRealPath(webPath);// 创建⽂件File file = new File(path);entFile().mkdirs();NewFile();// 获得上传⽂件流InputStream in = utStream();// 获得写⼊⽂件流OutputStream out = new FileOutputStream(file);// 流的对拷byte[] buffer = new byte[1024];int len;while ((len = (buffer)) > 0)(buffer, 0, len);// 关流();();// 删除临时⽂件();}}} catch (Exception e) {} catch (Exception e) {throw new RuntimeException(e);}}1234}3、实现⽂件上传的表单页⾯需要配置如下:1)⾸先要创建⼀个⽤于提交上传⽂件的表单页⾯。2)在页⾯中,需要使⽤标签在Web页⾯中添加⽂件上传输⼊项。3)必须要设置input输⼊项的name属性,否则浏览器将不会发送上传⽂件的数据。4)必须把将表单页⾯的method属性设置为post⽅式,enctype属性设置为“multipart/form-data”类型。4、⾸先获取下载⽂件的地址,并根据该地址创建⽂件字节输⼊流,然后通过该流读取下载⽂件内容,最后将读取的内容通过输出流写到⽬标⽂件中。第⼗三章【测⼀测】学习完前⾯的内容,下⾯来动⼿测⼀测吧,请思考以下问题:1、请描述传智书城项⽬的开发环境。2、请写出传智书城项⽬搭建所需要导⼊的jar包。3、请按照以下要求写出⽂件的配置。信息如下:1)数据库名itcaststore。2)⽤户名root。3)密码itcast。4、请按照要求写出数据源⼯具类。要求如下:1)⼯具类名为DataSourceUtils。2)⼯具类提供获取Connection对象、开启事务、提交事务、回滚事务。【答案】1、传智书城项⽬的开发环境如下:1)操作系统:Windows XP、Windows 7或更⾼的Windows版本。2)Web服务器:Tomcat7.0。3)Java开发包:JDK1.7。4)数据库:MySQL5.5。5)开发⼯具:Eclipse Java EE IDE for Web Developers。6)浏览器:IE8.0或更⾼版本。2、传智书城项⽬搭建所需要导⼊的jar包如下:1)2)3)4)5)6)7)8)9)10)3、⽂件的配置如下: root itcast jdbc:mysql:///itcaststorepublic void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response);} root itcast jdbc:mysql:///itcaststore4、数据源⼯具类DataSourceUtils实现代码如下:package ;import tion;import eption;import urce;import ooledDataSource;public class DataSourceUtils {private static DataSource dataSource = new ComboPooledDataSource();private static ThreadLocal tl = new ThreadLocal();public static DataSource getDataSource() {return dataSource;}/*** 当DBUtils需要⼿动控制事务时,调⽤该⽅法获得⼀个连接** @return* @throws SQLException/public static Connection getConnection() throws SQLException {Connection con = ();if (con == null) {con = nection();(con);}return con;}/** 开启事务** @throws SQLException/public static void startTransaction() throws SQLException {Connection con = getConnection();if (con != null)oCommit(false);}/** 从ThreadLocal中释放并且关闭Connection,并结束事务** @throws SQLException/public static void releaseAndCloseConnection() throws SQLException {Connection con = getConnection();if (con != null) {();();();}}/** 事务回滚* @throws SQLException*/public static void rollback() throws SQLException {Connection con = getConnection();Connection con = getConnection();if (con != null) {ck();}}}第⼗四章【测⼀测】学习完前⾯的内容,下⾯来动⼿测⼀测吧,请思考以下问题:1、请简要描述注册功能的设计思路。2、请简要描述购物车模块的设计思路。【答案】1、当新⽤户⾸次访问该⽹站时,需要先注册账号。在注册页⾯中新⽤户需要填写有邮箱、⽤户名、密码、重复密码、性别、联系电话、个⼈介绍以及验证码。⾸先对填写的注册信息进⾏校验,⽐如⽤户名和密码不能为空;密码和重复密码表单输⼊的内容必须⼀致;输⼊的邮箱地址应该是合法的等。然后查询数据库判断⽤户名是否存在。如果存在,则注册失败。如果不存在,则注册成功。2、当⽤户选择商品时,⾸先需要校验此⽤户是否登陆,如果未登录则提⽰⽤户登录,如果已经登陆则将商品添加⾄购物车,此时购物车中如已经有此商品,则商品数量加⼀,否则创建此商品。商品添加后可选择是继续购物、清空购物车还是进⾏结算,如果进⾏结算则让⽤户填写订单信息,之后⽣成订单,让⽤户完成在线⽀付。第⼗五章【测⼀测】学习完前⾯的内容,下⾯来动⼿测⼀测吧,请思考以下问题:1、请简要描述⼀下商品管理模块的设计思路和实现流程。2、请简要描述⼀下销量榜单下载功能的设计思路和实现流程。【答案】1、 商品管理模块主要的功能包括查询商品信息、添加商品信息、编辑商品信息和删除商品信息这4个功能。查询商品信息时可通过条件查询也可以查询所⽤商品。查询之后可进⼊商品列表页⾯,在此页⾯中提供了增加、修改和删除商品信息的功能。单击添加按钮,打开商品添加页⾯,填写商品信息之后,单击确定按钮后,新添加的商品信息即可在列表页⾯中显⽰出来。单击商品列表中修改按钮,页⾯会跳转到该商品的编辑页⾯,修改其中显⽰出商品的具体信息之后,单击保存按钮,商品管理⾸页将显⽰修改后的商品信息。单击列表页⾯中商品后⾯的删除按钮,会提⽰是否删除,确定删除后,系统会将此条商品信息删除,商品管理⾸页将不再显⽰此信息。2、模块主要实现的功能是下载历史销售数据,将已销售商品的信息,按照商品销量从⾼到低排序后导出到扩展名为“.csv”的⽂件中(csv⽂件即逗号分隔值⽂件格式,通常是纯⽂本⽂件)。下载销售数据时可以填写年份和⽉份这两个查询条件,在年份输⼊框和⽉份下拉框中分别填写相应信息,然后单击“下载”按钮,会弹出⽂件下载提⽰框,在提⽰框中选择⽂件的下载⽬录,单击“确定”后就可以将指定年份和⽉份的销售历史数据下载到⽂件中。
发布评论