[Java] JSP and Servlet Study Notes
Translated by AI from 中文 · View original
This post was recovered from Internet Archive snapshots; some images may be lost.
JSP and Servlet
The videos accompanying these notes are
【SiKi Academy JavaEE Video Tutorial】JavaWeb Season 1 Basics
【SiKi Academy JavaEE Video Tutorial】JavaWeb Season 2 Advanced
Preface
From my personal understanding, JSP is nearing retirement; you don't need to dig deep—just get a shallow taste.
Servlet, however, needs deep understanding; this is the foundation of many frameworks in the future.
Contains flowchart code; it is recommended to view with a professional Markdown editor (Evernote also works).
JSP Basic Syntax
Import
<%@page import=""%>
Comments
<%-- code --%>
Writing
<% code %>
Defining Expressions
<%! 成员变量 %>
Include Tags
Generally can be used to import repeated content across multiple web pages
or
<jsp:include page="xxx.jsp"></jsp:include>
Implicit Objects and Their Common Methods
out (== sou)
println()
Used for println() for output; can also be replaced with “=”request (lifecycle only within one HTTP request)
- getParameter()
get parameters- getRequestDispatcher(url).forward(request, response)
request forwarding request_do->login->client (note path issues)- setAttribute(key, content)/getAttribute(key)
pass values- getSession()
get the session object- getContextPath()
get the project path, used for relative pathsresponse
- getWriter().println()
written at the top of the HTML- getWriter().append()
append- sendRedirect(url)
redirect request_do->client->loginsession
setAttribute(key, content)/getAttribute(key)
pass valuesapplication (unique object)
setAttribute(key, content)/getAttribute(key)
pass valuespage
== this keyword
pageContext (container)
- getOut()
get the out object- getRequest()
req- getResponse()
resp- getServletContext()
app- getSession()
session
Servlet
Only handles process flow, separated from JSP.
extend HttpServlet throw ~Exception
Use it by overriding doGet(req, resp) and doPost(req, resp)Locate with the annotation @WebServlet(“url”)
You can also locate with web.xml (when creating a project, checking it at next can create it automatically)
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>
com.sikiedu.servlet.LoginServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login_ do</url-pattern><!-- 访问路径-->
</servlet-mapping>
</servlet>
Lifecycle
EL Expressions
Used to simplify JSP syntax, reduce code volume, and improve readability.
Getting Variables
- $
- $
(~ is req, session, application)
(scope priority is req, session, application)Generally, using the first form is enough
Getting Class Variables
$
Getting Map and Collection Values
Operations
{> < == || !}
$
Implicit Objects
$
JSTL Tags
Further simplifies JSP syntax and improves code readability.
It has the rudiments of syntax of some modern data-driven frontend frameworks.
Such as Vue.js and Angular.js.
Download JAR Package
Import
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
Define Values
<c:set var="" value="" scope=""></c:set>
Remove Values
<c:remove var=""/>
Output Values
<c:out value=""/>
Conditional Judgement
<c:choose>
<c:when test="${condition}">code</c:when>
<c:otherwise>code</c:otherwise>
</c:choose>
Loops
<c:foreach var="i" begin="index1" end="index2">
code
</c:foreach>
<c:foreach items="${list}" var="x">${x.var}</c:foreach>
JSON
The full name is "JavaScript Object Notation",
A lightweight data interchange format; its prototype is the data object in JavaScript.
Learn more
fastjson
An open-source Java-side JSON manipulation library from Alibaba.
fastjson's official GitHub
Download JAR Package
Import
import com.alibaba.fastjson.JSON
Serialization
JSON.toJSONString(object);
Deserialization
JSON.parseObject(String, object.class);
Serializing Arrays
JSON.parseArray(String, object.class);
AJAX
The full name is "Asynchronous Javascript And XML",
A technology that updates data without refreshing the web page through asynchronous requests.
This is a JavaScript technology, not a Java one.
JQuery Implementation
setInterval("callAjax()", 2000);//定时调用方法,参数单位为毫秒
function callAjax() {
$.ajax({
url: "${pageContext.request.contextPath }/ajaxrequest" ,
type:"get",
success: function(msg){
}
});
$("input").blur(callAjax); //失焦响应方法
Native JS Implementation
function callAjaxByJS(){
var xmlhttp = new XMLHttpRequest();
xmlhttpopen("GET", endcodeURI("${pageContext.request.contextPath}/ajaxRequest?data=我是数据&"+Math.random()), true)
xmlhttp.send();
xmlhttp.onreadystatechange = function(){
if( xmlhttp.readyState==4 && xmlhttp.status==200 ){
//得到了服务器端的响应,4代表ajax响应已完成,200是http正常状态码
$("#msg").append(xmlhttp.responseText);
}
}
}
Filter
class implement Filter
Lifecycle
Constructor->init()->doFilter()->destory()
doFilter()
chain.doFilter() will start the filter chain.
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException{
// TODO Auto-generated method stub
// place your code here
System.out.println("test1 filter before");
// pass the request along the filter chain
chain.doFilter(request, response);
System.out.println("test1 filter after");
}
Configure filtering conditions and order through web.xml,
or use @WebFilter(“/*”) to set conditions.
<filter>
<filter-name>Test1Filter</filter-name><!-- 名称 -->
<filter-class>com.sikiedu.filter.Test1Filter</filter-class><!-- 类名 -->
</filter>
<filter>
<filter-name>Test2Filter</filter-name>
<filter-class>com. sikiedu.filter.Test2Filter</filter-class>
</filter>
<filter-mapping>
<filter-name>Test2Filter</filter-name>
<url-pattern>/*</url-pattern><!-- 过滤目录 -->
</filter-mapping>
<filter-mapping>
<filter-name>Test1Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
The order set in web.xml is reversed during response,
that is, the code written after chain.doFilter() is executed.
Generally there is no need to use it.
Permission Management Filtering
<filter>
<filter-name>AdminFilter</filter -name>
<filter-class>com.sikiedu.filter.AdminFilter</filter-class>
<!-- 继承自Filter的类-->
</filter>
<filter-mapping>
<filter-name>AdminFilter</filter-name>
<url-pattern>/admin/*</url-pattern>
<!-- 此处为路径,*是通配符,代表所有 -->
</filter-mapping>
Request Filtering
Filter the request types initiated by the client to JSP.
This request does not refer to get and post, but to the request types defined by JSP.
<filter>
<filter-name>DispatcherFilter</filter-name>
<filter-class>com.sikiedu.filter.DispatcherFilter</filter-class><!-- 继承自Filter的类-->
</filter>
<filter-mapping>
<filter-name>DispatcherFilter</filter-name>
<url-pattern>/dispatcher1. jsp</url-pattern>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
There are five dispatcher types; the first four are commonly used.
- REQUEST Normal request
- FORWARD Request forwarding
- INCLUDE <jsp:include>
- ERROR Error request
- ASYNC Asynchronous request???
Error Page Settings
<error-page>
<error-code>404</error-code>
<location>/dispatcher1.jsp</location>
</error-page>
Listeners
A listener is a class; create a class
Implement the listener interface
Creation and destruction state listening
~initialized() ~Destroyed()javax.servlet.ServletContextListener
HttpSessionListener
ServletRequestListenerAttribute listening
~Added() ~Replaced() ~Removed()ServletContextAttributeListener
HttpSessionAttributeListener
ServletRequestAttributeListenerSession binding listening
- Make the model implement HttpSessionBindingListener
- Override the valueBound() and valueunbound() methods
- Configuration
<listener>
<listener-class>package.Listen-name.class</listener-class>
</listener>
- Set session timeout
<session-contig>
<session-timeout>1</session-timeout><!-- 单位为分钟-->
</session-config>
Special Topics
MVC Architecture
J2EE Layered Architecture
Singleton Pattern
Privatize the constructor and create an instance.
Avoid creating commonly used objects with new multiple times.
public static JDBCUtil instance = new JDBCUtil();
private JDBCUtil() {
}
Relative Paths and Absolute Paths
Client-Side Paths
Displayed in the client address bar or source code and can be requested.
Such as and the accessed URL.
Relative Paths
Determined by the path where the current URL directory is located.
Absolute Paths
Determined by the host (domain name) root path.
Generally, keep the path correct by adding contextPath.
<%=request.getContextPath()%>
or ${pageContext.request.contextPath}
Server-Side Paths
Executed only inside JSP.
Such as <jsp:include page=“xxx.jsp”> or request forwarding.
Relative Paths
Determined by the path where the current JSP file is located, in the form "xxx.jsp".
Absolute Paths
Determined by the project path, in the form "/folder/xxx.jsp".
No need to add the project name.
In actual use, it is recommended to use absolute paths to avoid errors.
Solving Chinese Parameter Garbled Text
Set encoding for String
System.out.println(new String(sex.getBytes("iso-8859-1"), "utf-8"));
Set encoding for request
request.setCharacterEncoding("utf-8");
Set encoding for response
resp.setContentType("text/html; charset=utf-8");
Ultimate solution: set encoding globally in doFilter
encoding = fConfig.getInitParameter("Encoding");
<!-- 在web.xml配置Encoding参数和filter-->
<filter>
<filter-name>EncodeFilter</filter-name>
<filter-class>com.sikiedu.filter.EncodeFilter</filter-class>
<init-param>
<param-name>Encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Single Sign-On
- Create a sessionManager class and build a collection of sessions (implemented with hashmap).
- Control through the added listener of session-attribute.
if(arg0.getName().equals("user")) {
User u = (User) arg0.getValue();
//判断是否有其他客户端已经登录
if(Sess ionManager . sess ionMppE containsKey(u. getUsername())) {
//获得另外一一个客户端的session
HttpSession session = SessionManager.sess ionMap. get(u.getUsername());
//把登录信息从这个客户端抹除
session. removeAttribute("user");
}
SessionManager.sessionMap.put(u.getUsername(), arg0.getSession());
}
Postscript
Next Steps for Learning
I personally suggest taking the SSM framework as the learning direction; SiKi Academy also has courses.
The SSH framework is somewhat outdated in some places; consider it as appropriate.
If You Want to Seek a Job
I personally suggest going back to review Java fundamentals after finishing learning the SSM framework.
Mainly use Volume 1 and 2 of 《Java Core Technology》 as reference books.
At the same time, you also need to learn basic knowledge related to data structures and algorithms.
Contact Me
GitHub
If you find these notes helpful, welcome to give me a Star.
Here is the project address for these notes: GitHub
Related code and notes will continue to be updated here.
What I have learned is still insufficient; you can also submit a PR here to correct my mistakes. I would be very grateful.
In addition, you can also contact me by email.
My email is: endcloud@qq.com