【JavaWeb】复习重点内容(一)

简介: 【JavaWeb】复习重点内容(一)

一、问答题7个左右,共40分


1.Servlet的定义、配置(使用xml或注解)


Servlet是用Java编写的服务器端程序,其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类。


Servlet的配置有xml和注解两种方式


xml方式:


<servlet>
  <servlet-name>demo</servlet-name>
    <!--全类名-->
    <servlet-class>web.servlet.ServletDemo</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>demo</servlet-name>
    <!--url访问的资源名-->
    <url-pattern>/index</url-pattern>
</servlet-mapping>


注解方式:在类上使用注解@WebServlet注解配置


@WebServlet("/demo")
public class ServletDemo implements Servlet {
    // 实现Servlet接口
}


2.重定向与请求转发的区别,使用API完成重定向和转发


重定向(Redirect)和请求转发(Forward)是两种不同的HTTP请求处理机制。


重定向是在接收到请求后,服务器向客户端返回一个特殊的响应,指示客户端重新向指定的url发送请求,这个过程是完全由客户端完成的,客户端会发送一个新的请求到指定的url,并接收新的响应。重定向经常被用来处理资源的移动,url的更改,或者是需要访问其他网站的情况。


请求转发则是在服务器端将请求转发给另一个资源进行处理,这个过程是在服务器内部完成的。客户端发送请求到服务器,服务器会将请求转发到另一个资源进行处理,然后将处理结果返回给客户端。请求转发经常被用来组合多个资源进行处理,例如在JSP中使用include指令将多个JSP页面组合在一起。


重定向:


response.sendRedirect("http://www.example.com");


转发:


RequestDispatcher dispatcher = request.getRequestDispatcher("/example.jsp");
dispatcher.forward(request, response);


在以上示例代码中,response和request是javax.servlet.http.HttpServletResponse和javax.servlet.http.HttpServletRequest的实例对象。重定向通过调用sendRedirect()方法并传入要重定向到的URL字符串来实现。请求转发则通过创建一个RequestDispatcher对象,该对象通过getRequestDispatcher()方法获取,并传入要转发到的资源的路径,然后调用forward()方法来实现。在请求转发中,request和response对象被传递给了要转发到的资源。


需要注意的是,重定向会向客户端发送一个新的请求,因此客户端的URL会发生改变,而请求转发是在服务器内部完成的,客户端的URL不会改变。


3.重定向与请求转发的优缺点


重定向的优点:


简单易用:使用response.sendRedirect()方法非常简单,可以很容易地将客户端重定向到其他URL。

安全性高:重定向会向客户端发送一个新的请求,因此客户端的URL会发生改变,可以避免某些安全漏洞,比如在表单提交后刷新页面导致的重复提交等。

重定向的缺点:


频繁网络请求:重定向会向客户端发送一个新的请求,会导致网络请求的增加,影响性能。

无法访问原始请求对象:重定向会生成一个新的请求对象,因此无法访问原始请求对象,如原始的HTTP请求头等。

请求转发的优点:


性能高:请求转发是在服务器内部完成的,不会向客户端发送新的请求,因此不会增加网络请求,性能比较高。

可以访问原始请求对象:请求转发可以访问原始请求对象,如原始的HTTP请求头等。

请求转发的缺点:


不适用于跨域请求:由于请求转发只能转发到同一Web应用程序中的资源,因此不能用于跨域请求。

不支持修改URL:请求转发是在服务器内部完成的,客户端无法感知,也无法修改URL。


4.给出了Servlet的代码实现,让大家用JSP来实现该功能


这个参考课本


使用JSP实现重定向和请求转发的示例代码:


重定向:


<%
  response.sendRedirect("http://www.example.com");
%>


请求转发:


<jsp:forward page="/example.jsp" />


jsp转换如下


<jps:useBean id="user" class="package.User" pageScope="session"/>
<%
  if(session.getAttribute("user")) == null {
        User user = new new User();
        session.getAttribute("user",user);
    }
%>


5.JavaBean的规范,应该详细掌握


JavaBean是一种符合Java语言规范的特殊类,通常用于存储和操作数据。JavaBean类应该遵循以下规范:


应该提供一个无参的构造方法:JavaBean的构造方法应该是无参的,这样可以方便地在其他类中创建JavaBean的实例。无参构造方法可以通过手动编写或者使用编译器自动生成的方式实现。

所有属性应该私有化:JavaBean的属性应该使用private修饰符进行私有化,通过提供公共的getter和setter方法来访问属性。

getter和setter方法的命名应该符合JavaBean命名规范:JavaBean的getter和setter方法应该遵循一定的命名规范。getter方法的名称应该以“get”开头,setter方法的名称应该以“set”开头,后面跟着属性名的首字母大写的形式。

应该提供默认的toString方法:JavaBean应该提供一个默认的toString方法,以便在调试和日志记录时方便查看JavaBean的属性值。

应该提供其他有用的方法:除了getter和setter方法以外,JavaBean还可以提供一些其他的有用方法,例如校验方法、计算方法等。


6.给出了Servlet的代码实现,让大家用JSTL来实现该功能


这个参考课本


JSTL(JavaServer Pages Standard Tag Library)是一个标准的JSP标签库,提供了一些常用的标签,可以方便地实现一些常见的操作,包括重定向和转发。以下是使用JSTL实现重定向和转发的示例代码:


重定向:


<c:redirect url="http://www.example.com" />


以上代码中,<c:redirect>标签用于实现重定向,url属性指定要重定向到的URL字符串。


请求转发:


<c:forward page="/example.jsp" />


以上代码中,<c:forward>标签用于实现请求转发,page属性指定要转发到的JSP页面的路径。


7.过滤器的概念,写出一个过滤器类


过滤器(Filter)是Java Web应用程序中的一个重要组件,可以拦截客户端请求和服务器响应,对它们进行预处理和后处理,实现一些通用的功能,例如日志记录、权限控制、字符编码转换等。


一个过滤器类必须实现javax.servlet.Filter接口,并重写其中的doFilter()方法。以下是一个简单的过滤器类的示例代码,实现了字符编码转换的功能:


import javax.servlet.*;
import java.io.IOException;
@WebFilter(filterName = "CharacterEncodingFilter", urlPatterns = "/*")
public class CharacterEncodingFilter implements Filter {
    private String encoding;
    public void init(FilterConfig config) throws ServletException {
        // 读取初始化参数,设置字符编码
        encoding = config.getInitParameter("encoding");
    }
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 设置请求和响应的字符编码
        request.setCharacterEncoding(encoding);
        response.setCharacterEncoding(encoding);
        // 调用后续的过滤器或Servlet/JSP处理请求
        chain.doFilter(request, response);
    }
    public void destroy() {
        // 释放资源
    }
}



以上代码中,使用@WebFilter注解配置了过滤器的名称和URL模式。filterName属性指定过滤器的名称,urlPatterns属性指定需要过滤的URL模式。在此示例中,过滤器会拦截所有的请求。


以上代码中,CharacterEncodingFilter类实现了javax.servlet.Filter接口,并重写了其中的init()、doFilter()和destroy()方法。init()方法在过滤器初始化时被调用,读取初始化参数并设置字符编码;doFilter()方法用于实现过滤功能,设置请求和响应的字符编码,并调用后续的过滤器或Servlet/JSP处理请求;destroy()方法在过滤器销毁时被调用,释放资源。


需要注意的是,过滤器配置除了注解的这种方式也可以在Web应用程序的web.xml文件中,通过过滤器链(Filter Chain)的方式实现多个过滤器的协同工作。过滤器的顺序可以通过<filter-mapping>元素中的<url-pattern>子元素来指定。


8.JPA中实体类、以及实体关系映射,一对一、一对多


在 JPA 中,实体类是指映射到数据库表的 Java 类。实体类通常具有以下特点:


实体类使用 @Entity 注解进行标记。

实体类的每个实例对应数据库表中的一行数据。

实体类的属性对应数据库表中的列。

JPA 中的实体关系映射用于描述实体类之间的关联关系,包括一对一、一对多、多对一和多对多关系。其中,一对一和一对多是较为常见的关系类型。


一对一关系映射示例:


@Entity
public class Person {
    @Id
    private Long id;
    private String name;
    @OneToOne(cascade = CascadeType.ALL)
    private Address address;
}
@Entity
public class Address {
    @Id
    private Long id;
    private String street;
    private String city;
    private String country;
    @OneToOne(mappedBy = "address")
    private Person person;
}



上述代码中,Person 和 Address 分别是两个实体类。它们之间的关系是一对一,通过 @OneToOne 注解进行映射。Person 实体类中的 address 属性使用 @OneToOne 注解,表示它与 Address 实体类是一对一关系。Address 实体类中的 person 属性也使用了 @OneToOne 注解,但是它的 mappedBy 属性指向了 Person 实体类的 address 属性,表示这是一个双向关联,并且由 Person 实体类来维护关系。


一对多关系映射示例:


@Entity
public class Department {
    @Id
    private Long id;
    private String name;
    @OneToMany(mappedBy = "department", cascade = CascadeType.ALL)
    private List<Employee> employees;
}
@Entity
public class Employee {
    @Id
    private Long id;
    private String name;
    private String email;
    @ManyToOne
    private Department department;
}



上述代码中,Department 和 Employee 分别是两个实体类。它们之间的关系是一对多,通过 @OneToMany 和 @ManyToOne 注解进行映射。Department 实体类中的 employees 属性使用了 @OneToMany 注解,表示它与 Employee 实体类是一对多关系。Employee 实体类中的 department 属性使用了 @ManyToOne 注解,表示它与 Department 实体类是多对一关系,并且它的 department 属性指向了 Department 实体类的 employees 属性,表示这是一个双向关联,并且由 Department 实体类来维护关系。


需要注意的是,上述示例中使用了 JPA 中的级联操作(CascadeType.ALL),表示当父实体被删除时,子实体也将被删除。这种级联操作可能会对数据产生不可逆的影响,因此需要谨慎使用。


9.Spring控制器的类的编写、路径的配置、注入组件、返回Json数据


在 Spring 中,控制器是指负责处理请求和响应的组件,通常由一个 Java 类实现。以下是 Spring 控制器类的编写、路径配置、注入组件和返回 JSON 数据的示例:


@Controller
@RequestMapping("/api/users")
public class UserController {
    @Autowired
    private UserService userService;
    @GetMapping("/{id}")
    @ResponseBody
    public User getUserById(@PathVariable Long id) {
        return userService.getUserById(id);
    }
    @PostMapping("/")
    @ResponseBody
    public User createUser(@RequestBody User user) {
        return userService.createUser(user);
    }
    @PutMapping("/{id}")
    @ResponseBody
    public User updateUser(@PathVariable Long id, @RequestBody User user) {
        return userService.updateUser(id, user);
    }
    @DeleteMapping("/{id}")
    @ResponseBody
    public void deleteUser(@PathVariable Long id) {
        userService.deleteUser(id);
    }
}



在上述示例中,我们定义了一个名为 UserController 的控制器类,并使用 @Controller 注解标记它。@RequestMapping 注解用于配置控制器类的路径前缀,即 /api/users。这意味着,当请求的路径以 /api/users 开头时,Spring 将会把请求交给该控制器类来处理。


在控制器类中,我们使用了 @Autowired 注解来自动注入一个名为 userService 的组件。这里假设 UserService 是一个已经定义好的服务组件,可以使用 @Service 注解标记它。


控制器类中的方法使用了不同的 HTTP 方法注解,包括 @GetMapping、@PostMapping、@PutMapping 和 @DeleteMapping,用于定义请求的 HTTP 方法类型。这些注解后面跟随的路径参数用于定义具体的请求路径。例如,@GetMapping("/{id}") 表示可以处理 /api/users/{id} 这样的 GET 请求。


在方法中,我们使用了 @ResponseBody 注解来表示将方法的返回值直接作为响应内容返回给客户端。这里,我们返回的是一个 User 类型的对象,Spring 会将它自动转换为 JSON 格式并返回给客户端。需要注意的是,为了能够让 Spring 自动完成 JSON 转换,我们需要在项目中引入相应的 JSON 库,例如 Jackson。


总的来说,Spring 控制器类提供了方便的方式来处理 HTTP 请求和响应,可以通过注解配置路径和 HTTP 方法,并且支持自动注入组件和返回 JSON 数据等常用功能。

相关文章
|
5月前
|
存储 前端开发 JavaScript
基于JavaWeb实现停车场管理系统
基于JavaWeb实现停车场管理系统
|
5月前
|
前端开发 JavaScript Java
图书借阅管理平台|基于JavaWeb实现图书借阅系统
图书借阅管理平台|基于JavaWeb实现图书借阅系统
109 1
|
2月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
365 37
|
27天前
|
前端开发 Java 应用服务中间件
Javaweb学习
【10月更文挑战第1天】Javaweb学习
29 2
|
1月前
|
安全 Java Android开发
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
41 5
|
2月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
5月前
|
前端开发 Java 关系型数据库
JavaWeb开发简介
JavaWeb开发简介
53 0
|
2月前
|
安全 Java Android开发
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
92 2
|
2月前
|
SQL JSON JavaScript
JavaWeb基础9——VUE,Element&整合Javaweb的商品管理系统
Vue 指令、生命周期、this和$、vue脚手架进行模块化开发/ElementUI框架、综合案例,element商品列表展示增删改查
JavaWeb基础9——VUE,Element&整合Javaweb的商品管理系统
|
5月前
|
SQL Java 数据库连接
JavaWeb Mapper代理开发
JavaWeb Mapper代理开发