tomcat在处理url参数时,默认是以ISO-8859-1字符集处理的,网上有很多人提出用String str = new String(request.getParameter("name").getBytes("ISO8859-1"),"utf-8");方式处理.
但这种方式很麻烦,用过滤器统一处理又更改不了request中的参数.难道要我每个servlet都去处理么?
所以我极力不推荐这种方法来处理url中文参数问题.
还有另外一个办法就是修改server.xml文件.在server.xml中找到<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>增加红字部分.
URL中文参数问题解决了.
HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse();1.2. ActionContext对象的方法
ActionContext ctx = ActionContext.getContext(); HttpServletRequest request = (HttpServletRequest)ctx.get(StrutsStatics.HTTP_REQUEST); HttpServletResponse response = (HttpServletResponse)ctx.get(StrutsStatics.HTTP_RESPONSE);1.3. ServletRequestAware,ServletResponseAware接口的实现
public class TestActionimplements ServletRequestAware, ServletResponseAware { private HttpServletRequest request; private HttpServletResponse response; public void setServletRequest(HttpServletRequest request) { this.request = request; } public void setServletResponse(HttpServletResponse response) { this.response = response; } }2. Request对象的常见应用
Request对象实际上保存的是从浏览器端发送来的请求信息,包括报文头中的信息、浏览器中的Cookie、表单中的数据等等。
2.1. 获取报文头中的信息Request对象中提供了很多get方法来提供请求报文头中包含的信息,举例如下:
getServerName() 服务器名
getProtocol() 协议
getMethod() 方法
getServerPort() 端口号
getContextPath() Context路径
getServletPath() Servlet路径
getRequestURI() URI路径
getQueryString() 查询字符串
getRemoteAddr() 远程用户IP地址
getRemotePort() 远程用户端口号
2.2. 获取请求发送的数据Request对象中包含了四个方法来获取浏览器端发送的数据:
String getParameter(String name) 获取名为name的参数值
Map getParameterMap() 获取数据的name –value映射表
Enumeration getParameterNames() 获取数据的name集合
String[] getParameterValues(String name) 获取同是名为name的数据的数组
获取到的数据值全部为String类型,与Struts2内置的数据获取形式相比效率较低。
另外,request还有另一套存取数据的方式,即:
void setAttribute(String name, Object value) 存储数据到request对象
Object getAttribute(String name) 从request对象中获取名为name的数据值
与parameter相比,attribute的区别在于它不是存在于报文中并解析出来的,而是直接存在于request对象内部的,它会随request对象的消亡而丢失。
2.3. 获取与该Request相关的SessionHttpSession getSession() 获取该Request所在作用域的Session
String getRequestedSessionId() 获取上述Session的ID
2.4. 跳转request.getRequestDispatcher(String path).forward(HttpServletRequest request, HttpServletResponse response) throws IOException
request对象可以指定一个路径,并跳转到那个路径,这个跳转可以把当前action(servlet)中的request对象和response对象一并传递过去,基本不会丢失request请求中的数据信息以及response中的设置。
3. Response对象的常见应用与request对象相比,response对象的用途似乎少了许多,因为无论是Struts2的action(其实质也是Servlet)还是Servlet,执行完跳转到下一个页面的过程实际上就是对下一个页面发送请求,因此需要传递的数据都会保存在request对象中作为attribute。response对象通常用于不向新页面发送请求的时候,对于Servlet来说,就是直接在Servlet中绘制JSP页面(通过PrintWriter getWriter()方法)的情况,或者需要绘制图像、传送JSON/ XML数据的情况。
通常情况下,在Struts2中很少会用到response对象。对于response对象的常见用法参见如下链接:
http://blog.163.com/hero_213/blog/static/39891214200922523616393/
3.1. 重定向response.sendRedirect(String location)
虽然在Struts2里,通过上述方法来进行重定向显得非常没有必要,但是因为很多公司的面试题都会考到,所以还是有必要记一下。这种重定向操作相当于丢弃当前所有的数据信息,直接打开新的链接。与request对象中的forward方式相比,它更快,因为不包含数据。
之所以说它已经被Struts2所淘汰,是因为在struts.xml中配置action的时候,可以在<result>标签中添加type=”redirect”属性,这时的跳转就是重定向了。
4. 总结虽然罗列了这么多,但是从Struts2的角度上讲,上述的方法除了获取Session、Cookie以及一些必要的报文头信息以外,基本上都已经过时了。这也正是Struts2将request和response隐藏了的原因,Struts2框架本身已经提供了其它的实现上述功能的途径。不过了解了总是好了,知其然亦知其所以然嘛。
有木有好心的java coder 帮我解决下这个问题~~
这个程序写完了后 开两个命令窗口进行编译通信,竟然会不能正常通信,是不是因为我写的socket是一个线程的原因。但是为什么开两个eclipse ,每个下面运行一个服务器端,和用户端就可以。
import java.util.*; import java.io.*; import java.net.*; public class SS { //server public static void main(String args[]){ ServerSocket socketServer=null; DataInputStream in=null; DataOutputStream out=null; Socket server; try{ socketServer=new ServerSocket(2060); } catch(Exception e1){ System.out.println("can't estblish socketServer "+e1); } try{ Scanner cin=new Scanner(System.in); System.out.println("you are server ,please send message to client"); server=socketServer.accept(); in=new DataInputStream(server.getInputStream()); out=new DataOutputStream(server.getOutputStream()); while(true){ String send=null,receive=null; receive=in.readUTF(); System.out.println("get message from client is "+receive); System.out.println("send message from client"); send=cin.nextLine(); out.writeUTF(send); } } catch(Exception e){ System.out.println("break! "+e); } } }
import java.util.*; import java.io.*; import java.net.*; public class CC { //client public static void main(String args[]){ Socket client=null; DataInputStream in=null; DataOutputStream out=null; try{ client=new Socket("127.0.0.1",2060); in=new DataInputStream(client.getInputStream()); out=new DataOutputStream(client.getOutputStream()); System.out.println("You are a client,you send message to server"); Scanner cin=new Scanner(System.in); while(true){ String send=null,receive=null; System.out.println("Please input Client message sending to server!"); send=cin.nextLine(); out.writeUTF(send); receive=in.readUTF(); System.out.println("Message from Server is:"+receive); Thread.sleep(500); } } catch(Exception e){ System.out.println("break!"+e); } } }
我先运行的server,在运行的client~~ 在eclipse下就可以正常通信。