Сайт: https://easyoffer.ru/
Все каналы: t.me/+xGeAw6ckJ4liYzQy
Контакт для рекламы: @sendme_ads
Post #474
4.72K
- 👍 5
- 👾 3
JA @easy_java_ru
Showing posts older than #477 · Back to latest
try-catch или должны быть указаны в сигнатуре метода с помощью ключевого слова throws. IOException, FileNotFoundException, ClassNotFoundException и другие.try {
FileInputStream file = new FileInputStream("non_existent_file.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
}FileNotFoundException является проверяемым исключением, и его необходимо обрабатывать в блоке try-catch.NullPointerException, IndexOutOfBoundsException, ArithmeticException и другие.int result = 10 / 0; // Приводит к ArithmeticException
ArithmeticException является непроверяемым исключением, вызванным делением на ноль.clone() - создает и возвращает копию объекта. Метод защищенный, поэтому его можно вызвать только внутри класса объекта или в классах потомках.equals(Object obj) - определяет равенство между двумя объектами. По умолчанию, этот метод сравнивает ссылки на объекты.finalize() - вызывается перед удалением объекта сборщиком мусора. Метод устарел.getClass() - возвращает Class, который представляет класс данного объекта. Можно использовать для получения имени во время выполнения.hashCode() - возвращает хеш-код, который используется для оптимизации хранения в структурах данных.notify() - пробуждает один поток, который ожидает на объекте (вызвавший wait()). Этот метод должен вызываться в синхронизированном контексте.notifyAll() - пробуждает все ожидающие потоки. Должен вызываться в синхронизированном контексте.toString() - возвращает строковое представление. По умолчанию, возвращает класс и хеш-код, но часто переопределяется для предоставления более информативного представления.wait() - заставляет текущий поток ожидать, пока другой поток не вызовет notify() или notifyAll(). Существуют перегруженные версии wait(long timeout) и wait(long timeout, int nanos), позволяющие указать максимальное время ожидания.class UserSettings {
void changeEmail(User user) {
if(checkAccess(user)) {
// Изменение email пользователя
}
}
boolean checkAccess(User user) {
// Проверка прав доступа
return true;
}
}UserSettings нарушает SRP, если бы в нем также были методы для управления пользователями. Лучше вынести метод checkAccess в отдельный класс.add(), remove(), size(), isEmpty() и iterator(), которые должны быть реализованы всеми коллекциями.ArrayList, LinkedList и Vector.HashSet, LinkedHashSet и TreeSet.LinkedList реализует как List, так и Queue. Также есть PriorityQueue для элементов, которые должны обрабатываться в порядке приоритета.Collection интерфейса. Описывает структуру для хранения пар ключ/значение. Ключи уникальны, а значения могут дублироваться. Реализации включают HashMap, LinkedHashMap, TreeMap и Hashtable.HashSet, сохраняя порядок вставки элементов.HashMap, сохраняя порядок вставки ключей.<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Dynamic Content</title>
</head>
<body>
<h1>Welcome, <%= request.getParameter("username") %>!</h1>
</body>
</html>
@WebServlet("/greeting")
public class GreetingServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
request.setAttribute("name", name);
request.getRequestDispatcher("/greeting.jsp").forward(request, response);
}
}
<html>
<head><title>Greeting</title></head>
<body>
<h1>Hello, ${name}!</h1>
</body>
</html>
<jsp:useBean id="user" class="com.example.User" scope="request"/>
<p>Username: <jsp:getProperty name="user" property="username"/></p>
<p>Current user: ${user.username}</p><%@ include file="header.jsp" %>
<%@ include file="footer.jsp" %>
<% ... %>
<%
String message = "Hello, World!";
%>
<p><%= message %></p>
<%= ... %>
<p>Current time: <%= new java.util.Date() %></p>
<%@ ... %>
➕ Пример:<%@ page contentType="text/html;charset=UTF-8" %>
${ ... }
<p>User: ${user.name}</p>
<jsp:include page="header.jsp" />
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>JSP Example</title>
</head>
<body>
<h1>Welcome to JSP!</h1>
<%
String username = "John Doe";
%>
<p>Hello, <%= username %></p>
<p>Current time: <%= new java.util.Date() %></p>
</body>
</html>
<security-constraint>
<web-resource-collection>
<web-resource-name>Protected Area</web-resource-name>
<url-pattern>/protected/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>USER</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>MyRealm</realm-name>
</login-config>
<security-role>
<role-name>USER</role-name>
</security-role>
<security-constraint>
<web-resource-collection>
<web-resource-name>Protected Area</web-resource-name>
<url-pattern>/protected/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>USER</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/login.html</form-login-page>
<form-error-page>/login-error.html</form-error-page>
</form-login-config>
</login-config>
<security-role>
<role-name>USER</role-name>
</security-role>
<security-constraint>
<web-resource-collection>
<web-resource-name>Protected Area</web-resource-name>
<url-pattern>/protected/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>USER</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>CLIENT-CERT</auth-method>
</login-config>
<security-role>
<role-name>USER</role-name>
</security-role>
web.xml. Это значительно упрощает процесс разработки и улучшает читаемость кода.import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
@WebServlet("/example")
public class ExampleServlet extends HttpServlet {
// Реализация сервлета
}
@WebFilter: для регистрации фильтра.import javax.servlet.annotation.WebFilter;
import javax.servlet.Filter;
@WebFilter("/*")
public class ExampleFilter implements Filter {
// Реализация фильтра
}
@WebListener: для регистрации слушателя.import javax.servlet.annotation.WebListener;
import javax.servlet.ServletContextListener;
@WebListener
public class ExampleListener implements ServletContextListener {
// Реализация слушателя
}
import java.io.IOException;
import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(urlPatterns = "/asyncExample", asyncSupported = true)
public class AsyncExampleServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
final AsyncContext asyncContext = request.startAsync();
asyncContext.start(() -> {
try {
// Долгосрочная задача
Thread.sleep(5000);
response.getWriter().println("Asynchronous processing complete.");
asyncContext.complete();
} catch (Exception e) {
e.printStackTrace();
}
});
}
}
ServletContextListener или в любое другое место, где доступен ServletContext.import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRegistration;
public class DynamicServletRegistrationListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
ServletContext context = sce.getServletContext();
ServletRegistration.Dynamic registration = context.addServlet("dynamicServlet", new ExampleServlet());
registration.addMapping("/dynamic");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
// Очистка ресурсов (если необходимо)
}
}
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
</dependencies>
import org.apache.commons.dbcp2.BasicDataSource;
public class DatabaseUtil {
private static BasicDataSource dataSource;
static {
dataSource = new BasicDataSource();
dataSource.setUrl("jdbc:mysql://localhost:3306/your_database");
dataSource.setUsername("your_username");
dataSource.setPassword("your_password");
dataSource.setMinIdle(5);
dataSource.setMaxIdle(10);
dataSource.setMaxOpenPreparedStatements(100);
}
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
}
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.32</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.6</version>
</dependency>
</dependencies>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.*;
import java.sql.*;
import org.slf4j.*;
@WebServlet("/databaseServlet")
public class DatabaseServlet extends HttpServlet {
private static final Logger logger = LoggerFactory.getLogger(DatabaseServlet.class);
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html");
try (PrintWriter out = response.getWriter();
Connection connection = DatabaseUtil.getConnection();
PreparedStatement statement = connection.prepareStatement("SELECT * FROM your_table");
ResultSet resultSet = statement.executeQuery()) {
while (resultSet.next()) {
out.println("<p>" + resultSet.getString("your_column") + "</p>");
}
} catch (SQLException e) {
logger.error("Database connection error", e);
response.getWriter().println("<p>Error connecting to the database</p>");
}
}
}