javaee之servlet的方法详解
来源:互联网 发布:丁彦雨航体测数据 编辑:程序博客网 时间:2024/06/06 18:39
ServletConfig类
概念和作用
ServletConfig类,servlet配置类,主要用于读取servlet的配置
获取ServletConfig对象
this.getServletConfig() 获取ServletConfig对象
读取servlet配置
1)在web.xml配置一个servlet的参数:
<servlet>
<servlet-name>ConfigDemo</servlet-name>
<servlet-class>gz.itcast.a_config.ConfigDemo</servlet-class>
<!-- servlet配置 -->
<init-param>
<param-name>filePath</param-name>
<param-value>e:/names2.txt</param-value>
</init-param>
</servlet>
2)读取init-param的数据,通过ServletConfig的方法读取:
ServletContxt类
概念和作用
ServletContext,servlet上下文对象,代表的是当前的整个web应用!!!!!
注意:在一个web应用中,只有一个ServletContext!!!
获取ServletContext对象
1) this.getServletConfig().getServletContext() 获取ServletContext对象
2) this.getServletContext() (推荐) 获取ServletContext对象
作用
1)读取web应用的配置信息(全局的,所有的servlet都可以获取)
步骤:
1)在web.xml配置web应用配置(全局参数)
<!-- web应用配置(全局) -->
<context-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</context-param>
2)在Servlet中读取context-param:
//1.获取ServletContext
ServletContext context =this.getServletContext();
String encoding = context.getInitParameter("encoding");
System.out.println(encoding);
2)在当前web应用中作为域对象使用
域对象的作用:
用来在不同的资源(servlet)之间共享数据!!!!!
域对象方法:
setAttribute("name",Object) 保存数据
getAttribute("name") 获取数据
removeAttribute("name") 清空数据
步骤:
1)保存:
//保存数据保存到域对象(ServletContext)
ServletContext context = this.getServletContext();
context.setAttribute("p", p);
2)获取:
//从域对象(ServletContext)取出数据
ServletContext context = this.getServletContext();
String p = (String)context.getAttribute("p");
response.getWriter().write("p="+p);
3)转发到web应用内的其他页面
//转发
//跳转到succ.html页面
/*ServletContext context = this.getServletContext();
// /: 在当前web应用
RequestDispatcher rd = context.getRequestDispatcher("/succ.html");
rd.forward(request, response);*/
//转发简化版:
request.getRequestDispatcher("/succ.html").forward(request, response);
4)读取web应用内的文件
//1.getRealPath(): 获取某个文件的绝对路径
/* ServletContext context = this.getServletContext();
// /: 代表web应用的根目录(部署到tomcat后的web应用)
//String path = context.getRealPath("/db.properties");
String path = context.getRealPath("/WEB-INF/classes/db.properties");
System.out.println(path);
File file = new File(path);
FileInputStream in = new FileInputStream(file);*/
//2. getResourceAsStream() : 获取的某个文件的输入流
ServletContext context = this.getServletContext();
// 和getRealPath()的路径写法一样!!!!
InputStream in = context.getResourceAsStream("/WEB-INF/classes/db.properties");
以前:IO
new File("e:/files/mm.jpg") 绝对路径
new File("./files/mm.jpg") 相对路径
不要这么写: new File("/files/mm.jpg")
现在:web
getRealPath("/files/mm.jpg")
getResourceAsStream(/files/mm.jpg"")
不要这么写:
getRealPath("e:/files/mm.jpg")
getRealPath("./files/mm.jpg")
4、接收请求
使用servlet接收请求和响应请求!!!
service
(HttpServletRequest req,HttpServletResponse resp)
HttpServletRequest:
请求对象。主要用于接收请求数据。
HttpServletResponse
: 响应对象,主要用于设置响应数据。
4.1 HttpServletRequest
对象
HttpServletRequest
对象封装所有浏览器发过来的信息。
请求格式:
请求行
请求头
空行
请求正文
4.2
核心方法(重点)
请求行:
请求方式:
请求路径:
GET
提交的数据:
http
协议版本:
请求头:
请求正文:
通用的获取用户提交数据:
//演示request对象的核心方法
public class RequestDemo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.请求行
//1.1 请求方式
System.out.println("请求方式:"+request.getMethod());
//1.2 请求路径
System.out.println("请求路径的uri:"+request.getRequestURI());
System.out.println("请求路径的url:"+request.getRequestURL());
//1.3 http版本号
System.out.println("http协议:"+request.getProtocol());
//1.4 get方式提交的数据
System.out.println("get提交数据:"+request.getQueryString());
//2. 请求头
//获取某个名称的头(用的多)
System.out.println(request.getHeader("User-Agent"));
//获取所有的头名称
//Enumeration enums = request.getHeaderNames();
//获取多个同名的头
//Enumeration enums = request.getHeaders("User-Agent");
//获取到整数类型的头
//int dnt = request.getIntHeader("DNT");
//int dnt = Integer.parseInt(request.getHeader("DNT"))
//获取日期类型的头
//new Date(request.getDateHeader("date"));
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//3.获取请求正文(post提交的数据)
InputStream in = request.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
System.out.println(br.readLine());
}
}
4.3
应用场景
1
)防盗链
//演示防盗链
public class RequestDemo2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//解决输出中文问题
response.setContentType("text/html;charset=utf-8");
String msg = "";
/**
* 识别盗链
*/
//获取referer请求头
String referer = request.getHeader("referer");
if(referer!=null && !referer.contains("http://localhost:8080/day09_02_request")){
msg = "这是盗链,下次报警了";
}else{
msg = "芙蓉日记...";
}
response.getWriter().write(msg);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
2
)获取和处理用户提交的数据
分两种情况:
GET
方式;放在请求路径后面 -》 request.getQueryString()
POST
方式:放在请求正文里面 -》 request.getInputStream()
通用(不分GET和POST)的获取用户提交数据的方法:
//演示获取用户提交的数据
/**
* SUN公司的request对象设计了几个通用的获取用户数据的方法:(都是字符串类型)
* *String getParameter("name"): 获取一个指定名称的值
* *String[] getParameterValues("name"):获取一个指定同名的多个值(多选)
* Enumeration getParameterNames():获取所有数据名称(只有名称)
* Map getParameterMap(): 获取所有数据(包含名称和值)
* @author APPle
*
*/
public class RequestDemo4 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.getParameter()
String userName = request.getParameter("userName");
System.out.println(userName);
System.out.println("======");
//2.getParameterValues()
String[] hobby = request.getParameterValues("hobby");
//Arrays.asList() 把数组转成集合,方便输出内容
System.out.println(Arrays.asList(hobby));
//3.getParameterNames()
System.out.println("======");
Enumeration enums = request.getParameterNames();
while(enums.hasMoreElements()){
String name = (String)enums.nextElement();
//注意:如果遍历所有的数据,应该使用getParameterValues()获取,当做都是多个值的
String[] value = request.getParameterValues(name);
System.out.println(Arrays.asList(value));
}
System.out.println("======");
//4.getParameterMap
Map map = request.getParameterMap();
Set<Entry> entrys = map.entrySet();
for(Entry entry:entrys){
String name = (String)entry.getKey();
String[] value = (String[])entry.getValue();
System.out.println(Arrays.asList(value));
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//调用doGet方法
doGet(request,response);
}
}
参数中文乱码问题
POST
解决办法:
1
)request.setCharacterEncoding("utf-8");
2
)
userName = newString(userName.getBytes("iso-8859-1"),"utf-8");
GET
解决办法:
手动重新再次解码:
userName = newString(userName.getBytes("iso-8859-1"),"utf-8");
- javaee之servlet的方法详解
- javaee之Servlet的理解
- 【JavaEE】Servlet的doGet()和doPost()方法
- JavaEE Servlet Session详解
- javaee之servlet的基础练习
- javaee之jsp和Servlet的练习
- javaEE之servlet总结
- JavaEE之Servlet
- JAVAEE之Servlet入门
- JAVAEE之Servlet进阶
- javaEE之servlet
- JavaEE——servlet详解
- JavaEE--缺省的Servlet
- 关于javaEE中servlet的构造函数和init方法
- JavaEE知识之servlet总结
- javaEE基础servlet之ServletConfig
- javaee基础之servlet(一)
- JavaEE之Servlet&JSP篇
- MyBatis Generator产生的Example类
- 【Android】35、基本布局——RelativeLayout
- 添加鼠标事件侦听
- JAVA的基本数据类型
- linux下安装phpredis
- javaee之servlet的方法详解
- 使用USRP实现ADS-B的飞机信号获取
- MATLAB sum()函数总结
- 第25天:1、项目章程和项目范围说明书的内容,控制账户,用户故事(属于引导式研讨会),收集需求的工具与技术
- Android 单排上王者系列之RxJava基础篇一
- codeforces 616D Longest k-Good Segment 尺取法
- 关于fragment
- 挫折使自己不断前行
- 简单逆序输出和空格转换