servlet1
Posted 飘然离去
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了servlet1相关的知识,希望对你有一定的参考价值。
5 Map<String, String[]> map = request.getParameterMap();
Set<String> set = map.keySet();
for(String str : set){
String[] parameter = map.get(str);
System.out.print("name:"+str+"--- value:");
for(String p:parameter){
System.out.print(p+" ");
}
System.out.println();
}
这里的map是个泛型,map是个容器,肯定有两个参数的,这里我们用的是一个key对应了多个value,所以是string,string[],平常是string,string就行了。
map.keySet();这是获得Map中所有的key值,并且放到set中,
for(String str : set)这里for叫增强for循环,便利所有的set对象中的数据。
6 相比较迭代器
Iterator只有一个参数,三个方法
hasNext()
如果仍有元素可以迭代,则返回 true。
E next()
返回迭代的下一个元素。
void remove()
从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。
7
Enumeration<String> names= request.getHeaderNames();
while(names.hasMoreElements()){
String name = names.nextElement();
System.out.println(name+"-----"+request.getHeader(name));
}
这个和迭代器差不多。
8 我们对于3个API的使用
第一个API是基础的API,第二个API是英文版的J2EE的API,第三个API是中文版的J2EE的API。
9 我们的API 中的大量的类,对象的方法。
但是如果我们在API找不到的类怎么办,我们在网上找.jar包,别人写好的类。(jar包就行别人写好的API中没有的类)
10 面向过程的东西发展到面向过程的方法,任何东西的学习都有规律。学霸都不是特别刻苦的人。
开发java的同时,完成自己的人生。
11 protect.这个关键字,如果子类继承了之后变为了private属性。还是protect孙子可以使用么。
12 你直接用地址栏写参数,然后直接访问参数的时候,只能用字符串,而你用设置属性的而doget方式传输,但是这样就可以了用object,任意类型传值。
13 火狐浏览器的网络的全部里边能看见你的get的几次请求,或者说post的几次请求。
14 重定向和转发的区别
(1)转发服务器的刷新,1次请求,可以地址栏传参。
request.getRequestDispatcher("/ServletTest02").forward(request, response);
(2)重定向表示客户端的刷新,2次请求,不能地址栏传参。
//response.sendRedirect("index.jsp");
15 HttpSession session 会话技术
仅适合于http协议,是http协议特有的。
Session是服务器和客户端建立连接后,服务器自动产生的。
其实就是服务器为每个访问服务器的浏览器开辟的单独的内存空间。
如何获取Session对象:request.getSession();
getMaxInactiveInterval()最长活跃时间。
getLastAccessedTime()最后一次访问时间。
session.invalidate();使失效
session.setMaxInactiveInterval(5);并且可以控制失效时间。Tomcat中conf中web.xml里修改时间。web.xml里修改时间。
setAttribute
getAtttibute
sesstion的属性只限于当前用户。
登录信息存储到那里比较合适。application 的属性会覆盖,session可以,但是占内存,存经常会访问并且不发生变化,而request只用一次。
没有session都有自己唯一的id。我们现在将色sesstion是服务器的session技术。
16 重定向方法://response.sendRedirect("ServletTest02");
转发的方法:request.getRequestDispatcher("/ServletTest02").forward(request, response);
重定向和转发都是在doget方法中,都用的是地址栏传参。
17 HttpServletResponse response
1.通过流生成动态页面
response.setContentType("text/html;charset=UTF-8");//MIME类型
2.设置响应编码
response.setStatus(302);
// response.setHeader("location", "main.html");
3.设置头信息
每隔n秒刷新页面
response.setHeader("refresh", "3");
3秒后跳转到新的页面
response.setHeader("refresh", "3;URL=main.html");
设置状态码,重定向
response.setStatus(302);
response.setHeader("location", "main.html");
/设置不缓存,验证码图片会使用到
/* response.setHeader("pragma", "no-cache");
response.setHeader("cache-control", "no-cache");*/
4.重定向,重新定向到一个新的页面。
out.println("登录成功!3秒后跳转到主页面,如果没有跳转,请点击<a href=‘main.html‘>这里</a>");
18 HttpServletRequest request 请求对象
服务器的功能是获取客户段的请求,返回响应。接收请求的对象就是request
所以,如果想要获取客户端的信息。那么就从request对象的方法找。
接收参数。(接收服务器传递的信息,1.表单 2.地址栏)注意复选框
String username = request.getParameter("username");
String password = request.getParameter("password");
String gender= request.getParameter("gender");
String[] like=request.getParameterValues("like");
String id = request.getParameter("id");
String text = request.getParameter("text");
Map<String, String[]> map = request.getParameterMap();
Set<String> set = map.keySet();
for(String str : set){
String[] parameter = map.get(str);
System.out.print("name:"+str+"--- value:");
for(String p:parameter){
System.out.print(p+" ");
}
System.out.println();
}
设置编码。
request.setCharacterEncoding("utf-8");
获取请求头信息。
Enumeration<String> names= request.getHeaderNames();
while(names.hasMoreElements()){
String name = names.nextElement();
System.out.println(name+"-----"+request.getHeader(name));
}
获取ip,端口,请求方法,请求的上下文路径等。
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
System.out.println(basePath);
存储和获取属性值
request.setAttribute("username", "admin");
request.setAttribute("age","12");
转发(跳转到新的页面)
request.getRequestDispatcher("/HttpServletRequestTest04").forward(request, response);
19
ServletContext application;
获取ServletContext 对象
1 通过ServletConfig获取
ServletContext application = config.getServletContext();
2 this.getServletContext获取。
ServletContext application1 = this.getServletContext();
作用:1.获取上下文和真实路径
application.getRealPath("/") //获取Tomcat安装的真实路径。
application.getContextPath();
2.读取配置的初始化信息
System.out.println(application.getInitParameter("hello"));
System.out.println(application.getInitParameter("charset"));
Enumeration<String> names = application.getInitParameterNames();
while(names.hasMoreElements()){
String name = names.nextElement();
String value = application.getInitParameter(name);
System.out.println(name+"~~~~~~~~~"+value);
}
3.存储和获取属性值。通过setAttibute/ getAttibute 方法。
application.setAttribute("username", "admin");
application.setAttribute("username", "admin1");
application.setAttribute("age", "13");
out.println(application.getAttribute("username"));
out.println(application.getAttribute("age"));
20 ServletConfig config
主要作用是读取Serlvet在web.xml中配置的初始化信息。
System.out.println(config.getServletName());
System.out.println(config.getInitParameter("hello"));
System.out.println(config.getInitParameter("charset"));
System.out.println("------------------------------------");
Enumeration<String> names = config.getInitParameterNames();
while(names.hasMoreElements()){
String name = names.nextElement();
String value = config.getInitParameter(name);
System.out.println(name+"~~~~~~~~~"+value);
}
21 apache公司旗下的tomcat.
22 每次修改了代码之后必须重新开启服务器。
23 ? 添加所有头文件的快捷方式。
24 Cookie
HttpSession session =request.getSession();
Cookie[] cooks=request.getCookies();
Cookie c1=new Cookie("c1","valuec1");
Cookie c2=new Cookie("c2","valuec2");
response.addCookie(c1);
response.addCookie(c2
);
if(cooks!=null&&cooks.length>0)
{
for(Cookie c:cooks)
{
out.println("name"+c.getName()+"value"+c.getValue());
}
}
第一次的登录的时候是没有cooie,只有在第二次的时候才有。
setMaxage中的负数,正数,0
*****************************
24
25 客户端没有Cookie时,怎么解决?
String url = response.encodeURL("CartServlet"); //重写URL地址。
//在路径上添加jsessionid
26 cookie中添加的时候用response,获取的时候用request.
重写地址的时候用resonse.
27 关于为什么要用java的API为什么用javaee的API。
在javaeeAPI中:httpservletrequest->getHeaderName()->返回值是我们说的enumeration.但是这个在javaAPI中超找不到,必须会到java的API中才行。
28 在request中的方法setHeader();
设置不缓存的方式在验证码的时候会用到,和我们的cookie中setMaxAge()中的0,不同的。
29 servlet是java技术对CGI编程的回答,Servlet程序在服务器在服务器端运行,动态地生成web页面,与传统的CGI相比,JAVA SERVLET具有更高的效率,更容易使用,功能更强大,具有更好的移植性。
20 servlet java版的CGI,CGI基于进程,servlet基于线程。
servlet几乎所有能想象到的扩展了服务器的功能。
通过servlet生成动态的页面。
21 web服务器apache ,IIS,tomcat
servlet无需任何改动即可移植到web服务器上。
22 servlet与CGI
servlet能直接与web服务器交互,而普通的CGI程序不能。servlet还能在各个程序之间之间共享数据,使得数据库连接池之类的功能很容易实现。
注意在线用户的统计,
商品的逻辑删除和物理删除。
数据库中的数据叫动态数据。
23 ???????????
Java定时器。
24 项目:商城
数据库 每天检查一次,如果超过一个月删除。定时器备份。
权限:通过菜单来控制。
日志管理。
25 重置按钮是默认的。int
26 双引号的中双引号用\区分。
27 乱码问题的解决
1 post方式的乱码,request的两个地方的添加。
2 get方式不仅需要request的添加。而且还需要在tomcat6.0/conf/server.xml中
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!-- A "Connector" using the shared thread pool-->
<!--
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
-->
在Connector标签的最后添加URIEncoding="utf-8"
3 sql语句在navic中能执行,在jdbc中则不能执行,出现乱码。
jdbc中mysql执行sql语句,解析式2进制,然后插找。所以数据库必须支持你的utf8.
在mysql/my.ini中修改两处
default-character-set=utf8
character-set-server=utf8
数据库中没有-。
28 乱码问题的处理保证整个乱码项目的统一。UTF-8,GBK.
29 修改文代码,必须启动Tomcat.
30 乱码分4阶段,
浏览器-》服务器-》数据库
最后SQL服务器需要重启。
特别重要的。
31 servelt单例对象,全国都用的这一个。
32 接口的作用为了不同分工之间的协调。
33 Tomcat中8080:不写的话。默认执行ROOT/index.jsp
8080:写的话,默认执行webapp中的工程。
34 myeclipse的不紧可以快速的建立setget方法,还可以迅速建立构造函数。
35 package sram.beans;这个包中的模型,string在数据库中表示的是varchar.
36 单行注释
反单行注释
多行注释 ctrl shift ?
反多行注释 不会
多行对齐 ctrl shift f
37 建立过滤器类的步骤:
随便建立一个类实现接口servlet中的filter,然后的根据提示添加包,然后实现他所有的方法。
38 数据库中设置主键自动增加,设置密码。
39 过滤器
关于写过滤器类的方法,先随便写一个方法,让后implements Filter.
然后右键实现所有的filter的方法。
关于过滤器的名字的问题,
在web.xml中的过滤器的名字必须和你的sram.filter包中的过滤器类的名字一样。 如果不一样就不能执行。
比如说过滤一个html文件,当你在浏览器中输入这个地址回车的时候,过滤器就会响应一次,
关于两个过滤器一起过滤提交表单的问题
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>sram.filter.MyFilter</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>gbk</param-value>
</init-param>
</filter>
<filter>
<filter-name>MyFilter02</filter-name>
<filter-class>sram.filter.MyFilter02</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<!-- <servlet-name>ServletTest</servlet-name> -->
<url-pattern>/*</url-pattern>
<!-- 表示过滤所有路径 -->
</filter-mapping>
<filter-mapping>
<filter-name>MyFilter02</filter-name>
<url-pattern>*.html</url-pattern>
<!-- 表示过滤所有路径 -->
</filter-mapping>
**********************
过滤器1表示什么都过滤,过滤器2表示只有.html需要过滤。
********************************
http://localhost:8080/20141209_22_Filter/test.html
************************************************
当按下回车的时候结果如下:
进入过滤器1......
进入过滤器2、、、
回到过滤器2、、、
返回过滤器1......
///////分析:
两个过滤器同时过滤的时候我们要明白 一个一个过滤,但是了他是嵌套的过滤,1先过滤的话,1最后出。
**************************************************
当填好wer,提交的时候:
进入过滤器1......
进入过滤器2、、、
回到过滤器2、、、
返回过滤器1......//这以上是刚才的
进入过滤器1......
username:wer
返回过滤器1......
40 老师的这个工程20141209_23_Login
主要说不能跳过登录界面直接进入到main.html。同时要注意也不能直接登录/LoginServlet。过滤器2就是为了解决这个问题而写的,过滤器二只能过滤/LoginServlet的东西。
WEB-INT文件下的东西,客户端浏览器不能看到的,通过服务器的转发可以看到。
*******************************
request.getRequestDispatcher("/WEB-INF/MyHtml.html").forward(request, response);
//服务器跳转的方式才能访问到web-inf文件夹下的资源。
--------------------------------
<a href="ServletTest">访问myhtml</a>
41 mapping 映射的意思。
<url-pattern>地址样式,地址模型。
42 快捷方式 ctrl shift 0 自动添加所有的类。
43 stof。字符串变浮点型。
44 当浏览器有缓存的时候,页面的就不会请求了。
45 <filter>
<filter-name>MyFilter</filter-name>
<filter-class>sram.filter.MyFilter</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>gbk</param-value>
</init-param>
过滤器中放初始化参数。
46 public class User 中经常放一个有参的和无参的构造函数。
47 老师的20141209_23_Login和22中过滤器类中用的方法不同。
48 listen
servletContext只要启动服务器就会自动运行运行。 ServletContextListener中的创建和ServletContexAttributeListener中的添加属性方法。而且是先调用后者中的方法。
以下的三个运用中对于属性的设置和修改都用的是setAttibute方法,移除用的是removeAttibute方法。
-----------------------------------------------
只要调用ServletContexAttributeListenerServletTest
创建了request:[email protected]
添加的属性: name=hello value=world
替换的属性: name=hello value=world
移除的属性: name=hello value=java
销毁了request:[email protected]
----》关于销毁的解释:
-------------------------------------------
浏览器调用sesstion的servlet
创建了request:[email protected]
session创建.......................DF1E094AEA81D5177A6F236FF19364EA
sessionid:DF1E094AEA81D5177A6F236FF19364EAadd Attribute name=hello value=world
sessionid:DF1E094AEA81D5177A6F236FF19364EAreplace Attribute name=hello value=world
sessionid:DF1E094AEA81D5177A6F236FF19364EAremoved Attribute name=hello value=java
销毁了request:[email protected]
----》关于销毁的解释:
3种方法(1)时间到了,在Tomcat/conf/web.xml中sesstion-config标签中单位是分钟(2)调用销毁的方法。session.invalidate();(3)关闭浏览器或者说服务器这个不清楚。关闭服务器才对,但是关闭浏览器只是关闭当前用户,别的用户都可以用。
***************************************************
浏览器调用request的servlet
创建了request:[email protected]
request::[email protected] Attribute name=hello value=world
request::org.apache.catalina.connector.RequestFacad[email protected] Attribute name=hello value=world
request::[email protected] Attribute name=hello value=java
销毁了request:[email protected]
****************************************************************
49 20141209_25_BaseServlet
的运行的方式:http://localhost:8080/20141209_25_BaseServlet/UserServlet?method=add
50 快速选中一个单词的快捷方式。
51 反射:
反射getMethod()是把方法看成了对象,反射,反向显示类的信息,Class是我们平时所用类的类型,我们平时所用的类是Class这个类的对象。
invoke父类中执行子类的方法。invoke 调用静态方法,那么不需要对象只需要一个Null就行了。
放射的功能1)获取Person的对象,2)获取类的构造方法,3)获取属性。
我们可以通过JAVASE的API中查看API中Class的方法解决问题。
最重要的就是获取私有方法和获取共有的方法。
暴力访问,(破坏封装性)
getDeclearedConstruct();
setAccessible(true);
如果没有第二句话,也可以用其他的方法。
放射中老师用到的方法:
(1)Class<Person> c1 = Person.class;
(2)Person p = new Person();
Class<Person> c2 = (Class<Person>) p.<Person>getClass();//泛型一般要强转
(3)Class<Person> c3 = (Class<Person>) Class.forName("sram.beans.Person");
(4)Person p = c1.newInstance();//这个newInstance相当于new用来创建对象。
(5)Constructor<Person> con = c1.getDeclaredConstructor(); //无参的构造方法
con.setAccessible(true); //暴力访问,破坏封装性。
Constructor<Person> con1 = c1.getConstructor(String.class,int.class);//根据参数获取构造方法
Person p1 = con1.newInstance("zs",1);
Constructor[] cons = c1.getConstructors();
Constructor[] cons1 = c1.getDeclaredConstructors();
for(Constructor c :cons){
System.out.println(c);
}
(6)Method method = c1.getMethod("sys", String.class,int.class);
method.invoke(p, "hello",+10000);
Method method1= c1.getDeclaredMethod("talk");
method1.setAccessible(true);
method1.invoke(p);
Method method2= c1.getDeclaredMethod("say");
method2.invoke(p);
(7) Person p = new Person();
Field field = c1.getField("age");
field.setInt(p, 10);
System.out.println(p.age);
Field field1 = c1.getDeclaredField("name");
field1.setAccessible(true);
field1.set(p, "zs");
System.out.println(p.getName());
(8)反射的综合运用
Person p1 = new Person("ww", 100);
Class c2 = p1.getClass();
Field f = c2.getDeclaredField("name");//getName
System.out.println(f.getName());
// f.setAccessible(true);
//System.out.println(f.get(p1));
Method m = c2.getMethod("get"+ f.getName().substring(0,1).toUpperCase()+f.getName().substring(1));
System.out.println("get"+ f.getName().substring(0,1).toUpperCase()+f.getName().substring(1));
Object obj = m.invoke(p1);
System.out.println(obj);
52无限参本身就是一个数组,无限参和有限参在一起的时候,无限参放后边。
public class Test {
public void test(int a,String... str){ //无限参数的本质就是数组。
System.out.println(str.length);
}
public static void main(String[] args) {
String[] str = {"a","b","c"};
Test t = new Test();
t.test(1,"1","2","3");
}
}
53 加载官方的原代码。
54 String[] str = new String[]{};
55 购物车 数据库table cart
56 反射中的注解和动态代理。
57 我们学习js时候用的API是w3school。
58 关于servlet单例对象的理解,一个工程下可以有多个类继承httpservlet,但是每一个继承httpservlet的类只能产生一个对象。
59 init param 这种标签只有两处,1 在servlet标签中的初始化参数,2 在filter中。
60 <init-param>这个标签两个用到, 在cnfig中(servlet的web.xml),访问的方法是getInitParameter(name)
在context中(web.xml)虽然没有<init-param>标签访问的方法是getInitParameter(name).
61 在config中只能读取servlet 参数,但是不能设置,
在context中可以设置context标签中的值,不能有<init-param>,
设置分为两种一种在xml文档中直接设置标签。另一种setAttibute.
62 设置字体windows->prefences->general->appea 开头。
63 jsp的访问,直接用浏览器访问,不能再html中那个浏览器直接访问。
64 编程字体 0 o ,i 1(数字1) I l(英文字母l)。
65 快捷方式
ctrl shift c 多行注释,可以反注释。
ctrl shift ? 多行注视,不可以反注释。
以上是关于servlet1的主要内容,如果未能解决你的问题,请参考以下文章