文章目录
servlet路径错误
今天idea写了个servlet
默认生成的
@WebServlet(name=“getParameter”)
然后在访问的时候无法访问,
servlet路径配置方法
@WebServlet方法,推荐
修改为
@WebServlet("/getParameter")
可以通过
http://localhost:8080/servlet2_war_exploded/getParameter?x1=lmkservlet
进行访问
源代码
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/getParameter")
public class getParameter extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String x1=request.getParameter("x1");
PrintWriter out1=response.getWriter();
out1.print("<html><body><p> 请求参数x1的值为"+x1+"</p></body></html>");
}
}
web-xml 配置路径方法,老方法
或者也可以再 web-iml 中进行配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>Hello</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/Hello</url-pattern>
</servlet-mapping>
</web-app>
解决servlet 中文乱码的方法
方法一直接设定 字符集
这样的好处就是简单,
但是当几十个servlet都采用这种方式,每次设定都很麻烦
当servlet很多是,我推荐 方法二 全局过滤器 Filter
//设置请求字符集
request.setCharacterEncoding("utf-8");
//设置响应头字符集,告诉浏览器是什么字符集
response.setContentType("text/html;charset=utf-8");
//设置响应字符集
response.setCharacterEncoding("utf-8");
完整代码
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/getParameter")
public class getParameter extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");
String x1=request.getParameter("x1");
PrintWriter out1=response.getWriter();
out1.print("<html><body><p> 请求参数x1的值为"+x1+"</p></body></html>");
}
}
方法二 设定全局过滤器
Filter的执行顺序与在web.xml配置文件中的配置顺序一致,一般把Filter配置在所有的Servlet之前。
过于过滤器的几点常识
过滤器只会被初始化一次
所以过滤器常驻内存
所以只有很必要的操作才需要使用过滤器
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
//指定路径匹配 以及过滤器名称, /* 就是全局所有请求都匹配
@WebFilter(filterName = "setCharacterCoding" ,urlPatterns = "/*")
public class setCharacterCoding implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
String codingmode="utf-8";
req.setCharacterEncoding(codingmode);
resp.setContentType("text/html;charset="+codingmode);
resp.setCharacterEncoding(codingmode);
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
}
}
启用全局过滤器之前
启用全局过滤器之后
配置初始化参数
@WebServlet
参数设置用法
@WebServlet(urlPatterns = “/getinit”, initParams = {@WebInitParam(name = “姓名”, value = “lmk”),
@WebInitParam(name = “classname”, value = “init初始化参数”, description = “基本信息”)}
)
参数获取
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String innner = this.getInitParameter(“姓名”) + “
”;
package two;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(urlPatterns = "/getinit", initParams = {@WebInitParam(name = "姓名", value = "lmk"),
@WebInitParam(name = "classname", value = "init初始化参数", description = "基本信息")}
)
public class getInitPara extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String innner = this.getInitParameter("姓名") + "<br>";
innner += this.getInitParameter("classname");
PrintWriter out1 = response.getWriter();
out1.print(innner);
out1.close();
}
}
context 上下文初始化参数
首先在web.xml 中配置上下文
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 配置上下文参数,所有的Servlet中都可以使用 -->
<context-param>
<param-name>sx1</param-name>
<param-value>上下文介绍</param-value>
</context-param>
</web-app>
上下文参数调用
String innner = this.getServletContext().getInitParameter(“sx1”) ;
servlet 初始化参数以及上下文参数的区别
局部初始化参数只能当前servlet获取
上下文初始化参数可以,在整个web 应用中获取
会话跟踪
由于http的无连接性
必须应用程序自己唯一表示用户
cookie使用
cookie 最多保存20个值
大小不超4kb
位于 javax.servlet.http.Cookie
Cookie(String name, String value)
setCookie servlet
创建了 Cookie 之后,
在 respose 中 setCookies
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String id1=UUID.randomUUID().toString();
Cookie c1=new Cookie("id",id1);
response.addCookie(c1);
getCookie servlet
在 request 中getCookies
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie[] cs=request.getCookies();
for(Cookie c1:cs){
if (c1.getName().equals("id")){
PrintWriter out1= response.getWriter();
out1.print("获取的cookie id 值是"+c1.getValue());
out1.close();
}
}
}
cookie 的生命周期
当cookie不设置生命周期时,cookie默认是 会话cookie
当设置了cookie的生命周期,以后,cookie,就成了持久cookie,