① 怎样用java web和websocket实现网页即时通讯
原理
WebSocket protocol 。
现很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给客户端的浏览器。这种传统的HTTP request 的模式带来很明显的缺点 – 浏览器需要不断的向服务器发出请求,然而HTTP request 的header是非常长的,里面包含的有用数据可能只是一个很小的值,这样会占用很多的带宽。
而比较新的技术去做轮询的效果是Comet – 用了AJAX。但这种技术虽然可达到全双工通信,但依然需要发出请求。
在 WebSocket API,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。在此WebSocket 协议中,为我们实现即时服务带来了两大好处:
1. Header
互相沟通的Header是很小的-大概只有 2 Bytes
2. Server Push
服务器的推送,服务器不再被动的接收到浏览器的request之后才返回数据,而是在有新数据时就主动推送给浏览器。
一、项目简介
WebSocket是HTML5一种新的协议,它实现了浏览器与服务器全双工通信,这里就将使用WebSocket来开发网页聊天室,前端框架会使用AmazeUI,后台使用Java,编辑器使用UMEditor。
二、涉及知识点
网页前端(HTML+CSS+JS)和Java
三、软件环境 Tomcat 7 JDK 7 Eclipse JavaEE 现代浏览器
四、效果截图
效果1
3. 编写后台代码
新建一个com.shiyanlou.chat的包,在包中创建一个名为ChatServer的类,从JavaEE 7开始就统一了WebSocket的API,因此无论是什么服务器,用Java写的代码都是一样的,代码如下:
?
041424344454647484950 package com.shiyanlou.chat;import java.text.SimpleDateFormat;import java.util.Date;import javax.websocket.OnClose;import javax.websocket.OnError;import javax.websocket.OnMessage;import javax.websocket.OnOpen;import javax.websocket.Session;import javax.websocket.server.ServerEndpoint;import net.sf.json.JSONObject;/*** 聊天服务器类* @author shiyanlou**/@ServerEndpoint("/websocket")public class ChatServer {private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm"); // 日期格式化@OnOpenpublic void open(Session session) {// 添加初始化操作}/*** 接受客户端的消息,并把消息发送给所有连接的会话* @param message 客户端发来的消息* @param session 客户端的会话*/@OnMessagepublic void getMessage(String message, Session session) {// 把客户端的消息解析为JSON对象JSONObject jsonObject = JSONObject.fromObject(message);// 在消息中添加发送日期jsonObject.put("date", DATE_FORMAT.format(new Date()));// 把消息发送给所有连接的会话for (Session openSession : session.getOpenSessions()) {// 添加本条消息是否为当前会话本身发的标志jsonObject.put("isSelf", openSession.equals(session));// 发送JSON格式的消息openSession.getAsyncRemote().sendText(jsonObject.toString());}}@OnClosepublic void close() {// 添加关闭会话时的操作}@OnErrorpublic void error(Throwable t) {// 添加处理错误的操作}}
4. 前后台交互
后台写完了,前台要用WebSocket连接后台,需要新建一个WebSocket对象,然后就可以和服务器端进行交互,从浏览器发送消息给服务器端,同时要验证输入框的内容是否为空,然后接受服务端发送的消息,把它们动态地添加到聊天内容框中,在
?
04142434445464748495051525354 var um = UM.getEditor('myEditor');$('#nickname')[0].focus();// 新建WebSocket对象,最后的/websocket对应服务器端的@ServerEndpoint("/websocket")var socket = new WebSocket('ws://${pageContext.request.getServerName()}:${pageContext.request.getServerPort()}${pageContext.request.contextPath}/websocket');// 处理服务器端发送的数据socket.onmessage = function(event) {addMessage(event.data);};// 点击Send按钮时的操作$('#send').on('click', function() {var nickname = $('#nickname').val();if (!um.hasContents()) { // 判断消息输入框是否为空// 消息输入框获取焦点um.focus();// 添加抖动效果$('.ei-container').addClass('am-animation-shake');setTimeout("$('.ei-container').removeClass('am-animation-shake')", 1000);} else if (nickname == '') { // 判断昵称框是否为空//昵称框获取焦点$('#nickname')[0].focus();// 添加抖动效果$('#message-input-nickname').addClass('am-animation-shake');setTimeout("$('#message-input-nickname').removeClass('am-animation-shake')", 1000);} else {// 发送消息socket.send(JSON.stringify({content : um.getContent(),nickname : nickname}));// 清空消息输入框um.setContent('');// 消息输入框获取焦点um.focus();}});// 把消息添加到聊天内容中function addMessage(message) {message = JSON.parse(message);var messageItem = '<li class="am-comment '+ (message.isSelf ? 'am-comment-flip' : 'am-comment')+ '">'+ '<a href="javascript:void(0)" ><img src="assets/images/'+ (message.isSelf ? 'self.png' : 'others.jpg')+ '" alt="" width="48" height="48"/></a>'+ '<div><header><div>'+ '<a href="javascript:void(0)">'+ message.nickname + '</a> <time>' + message.date+ '</time></div></header>'+ '<div>' + message.content+ '</div></div></li>';$(messageItem).appendTo('#message-list');// 把滚动条滚动到底部$(".chat-content-container").scrollTop($(".chat-content-container")[0].scrollHeight);}
到这步,简单的网页聊天室就完成了,你可以多开几个窗口或在局域网中邀请小伙伴们来一起测试。
六、小结
本次项目课使用WebSocket实现了简单的网页聊天室,其实WebSocket不仅可以应用于浏览器,也可以应用于桌面客户端。
② 如何利用Chromium For Android开发Android浏览器
应用层次概念图
layers 每个盒子代表一个概念中的应用层。通常情况下应该有可能通过替换任意一层及其上层组建来生成一个新的浏览器。因此,没有任何层应该与其更高层次有依赖关系。 WebKit的:Safari,Chromium和其他所有基于WebKit的浏览器都使用Webkit作为渲染引擎。WebKit Port是WebKit的一部分,处理与具体平台相关的操作,如资源加载和图形。 Glue: 将WebKit类型转换成Chromium类型 。这就是我们的“WebKit嵌入层”。这是浏览器Chromium和test_shell(允许我们测试WebKit)的基础。 Renderer/Render Host: 这是Chromium的“多进程嵌入层。”由它代理传递跨进程的消息和命令。你可以想象,其他的多进程浏览器也可以使用这一层,它对其他的浏览器服务没有依赖。 Tab contents: Chrome的特有层,来表示标签显示的内容。它与应用服务绑定, 例如密码管理器和history系统。本层不应该假设它嵌入在Chromium浏览器窗口中(还有其他Chromium组件如”HTML对话框“使用本层)。 浏览器:展现浏览器窗口,它嵌入了多个TabContentses。 WebKit 我们使用 WebKit这个开源项目来展示网页。此代码主要是由Apple编写的并存放在/third_party/WebKit目录中。WebKit主要包括两部分:“WebCore”负责核心布局功能,“JavaScriptCore”用来执行JavaScript。我们只将JavaScriptCore用于测试目的,通常我们使用高性能的V8 JavaScript引擎取代它。我们实际不使用苹果称之为“WebKit”的软件层(译注:就是WebKit/Source/WebKit目录下的内容,Webkit/Source目录下同样有WebCore和JavaScriptCore目录),这个软件层用在如Safari这样的应用程序中,用来衔接WebCore和OS X。为了方便,我们通常将从Apple获取的代码称作“WebKit”。(译注,其实只使用了WebCore) The WebKit Port 在最底层,我们有我们的WebKit“Port”。这是我们实现的平台相关的代码,它用来衔接平台和WebCore。这些文件位于WebKit目录中,通常在Chromium目录中或者以Chromium为后缀名。实际上Port的大部分代码不是和操作系统相关的:你可以把它看成是WebCore的Chromium Port(译注:用来衔接WebKit和Chromium的)。有些部分,如字体渲染,必须针对每个操作系统平台分别处理。 网络流量是由我们的多进程资源加载系统处理的,而不是由渲染进程直接调用操作系统完成。 图形使用为Android开发的Skia图形库。这是一个跨平台的图形库,原生的处理除了文字以外的所有图形、图像。Skia位于/third_party/skia。图形操作的主要入口点是 / WebKit/port/platform/graphics/GraphicsContextSkia中。这个对象表示一个网页。它处理所有从浏览器进程出入的与导航有关的命令。它继承自RenderWidget,负责提供绘画和输入的处理。RenderView通过全局的(对每个渲染进程来说是全局,即每个进程一个)RenderProcess对象与浏览器进程通信。 常见问题:RenderView和RenderWidget的有什么差异?RenderWidget通过实现名为WebWidgetDelegateglue层的抽象接口WebWidgetDelegate映射到一个的WebCore::Widget这基本上是屏幕上的一个窗口,它绘制窗口并接收窗口中的输入事件。RenderView从RenderWidget继承,它表示一个标签或弹出窗口的内容。它处理所有导航命令并完成窗口绘制和响应输入事件。只有一种情况下如RenderWidget独立于RenderView存在:网页上select boxes。它是个有向下箭头和很多选项的弹出列表。在选择框必须使用原声窗口渲染,以便他们能够在显示在其他东西之上,并在必要时弹出框架。这些窗口需要绘制并接收输入,但是他们不是一个单独的“网页”(RenderView)。 渲染器中的线程 每个渲染器中运行着两个线程:渲染线程和主线程。渲染线程是RenderView和其他所有的WebKit代码运行的线程。当它和浏览器之间进行通信时,首先将消息送到主线程,然后主线程再将消息传递给浏览器进程。只有主线程收到浏览器的回复之后渲染才可以继续进行,这样可以使我们同步地将消息从渲染器传递给浏览器。例如,当页面中的JavaScript请求cookie时,渲染线程将被阻塞,主线程将所有收到的消息放入队列直到接收到浏览器的正确回复。在这期间收到的任何消息都将按照顺序发送给渲染线程进行处理。 浏览器进程 rendering browser 浏览器进程的底层对象 所有和渲染进程之间的通信都通过浏览器进程中的I/O线程实现的。它同样也处理所有的网络通信,这样可以不阻塞用户界面。
当主线程初始化RenderProcessHost完毕后(用户界面运行时),它建立新的渲染进程并新建名为ChanelProxy的IPC对象通过命名管道与之通信。这个对象运行于Browser的I/O线程中,监听连接到渲染进程的命名管道,并将所有消息转发到UI线程的RenderProcess对象。ResourceMessageFilter会过滤掉能够直接执行的I/O处理消息,比如说网络请求。过滤使用ResourceMessageFilter::OnMessageReceived方法。 Ui线程中的RenderProcessHost负责分发所有显示相关的消息给RenderViewHost(同时它也会处理有限的几种非显示相关的消息)。消息的分发在RenderProcessHost::OnMessageReceived函数执行。 浏览器进程的高层对象 显示相关的消息会进入RenderViewHost::OnMessageReceived。大部分消息在这里处理,其他的则被转发到RenderWidgetHost。渲染进程中有两个对象对应到RenderView和RenderWidget对象。在Microsoft Windows上,对于每个RenderWigetHost都有一个RenderWidgetHostHWND与之对应,这个类专门负责管理消息事件并绘制原生的HWND。其他系统上也有类似的负责原生输入和绘图的对象。 在renderView/Widget对象之上是WebContent对象,大部分的消息都是在这个对象中响应的。WebContents表示一个tab中的内容。它继承自通用的TabContents对象(还有其他集中TabContents的子类,比如下载页面或历史页面)。它是大部分导航和顶层浏览器UI更新的结合点(switching point)。 FAQ:为什么要分离WebContents和RenderViewHost对象?
原因有二:这两个对象提供不同层面的功能。
③ 运行JavaScript脚本需要哪些库放到哪个目录下
你好运行js脚本不需要调用其他库。
如果是用jquery这些库的话需要引入对应的文件。
同时放在哪个目录都是你来决定,只要路径引用正确就可以了!
希望能帮到你~
④ 用java编写网络爬虫,用来爬网络音乐资源,再返回java页面显示该怎么实现
下面是源代码,希望可以帮到你~~
package com.ly.mainprocess;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.Consts;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.StatusLine;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
public class Test1 {
public static void main(String[] args){
Test1 test1 = new Test1();
System.out.println(test1.process("******","******"));
}
@SuppressWarnings("deprecation")
public boolean process(String username,String password) {
boolean ret=false;
DefaultHttpClient httpclient = new DefaultHttpClient();
try {
HttpGet httpget;
HttpResponse response;
HttpEntity entity;
List<Cookie> cookies;
//组建登录的post包
HttpPost httppost = new HttpPost("http://login.hi.mop.com/Login.do"); // 用户登录
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("nickname", username));
nvps.add(new BasicNameValuePair("password", password));
nvps.add(new BasicNameValuePair("origURL", "http://hi.mop.com/SysHome.do"));
nvps.add(new BasicNameValuePair("loginregFrom", "index"));
nvps.add(new BasicNameValuePair("ss", "10101"));
httppost.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8));
httppost.addHeader("Referer", "http://hi.mop.com/SysHome.do");
httppost.addHeader("Connection", "keep-alive");
httppost.addHeader("Content-Type", "application/x-www-form-urlencoded");
httppost.addHeader("Accept-Language", "zh-CN,zh;q=0.8");
httppost.addHeader("Origin", "http://hi.mop.com");
httppost.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36");
response = httpclient.execute(httppost);
entity = response.getEntity();
// System.out.println("Login form get: " + response.getStatusLine());
EntityUtils.consume(entity);
// System.out.println("Post logon cookies:");
cookies = httpclient.getCookieStore().getCookies();
if (cookies.isEmpty()) {
// System.out.println("None");
} else {
for (int i = 0; i < cookies.size(); i++) {
// System.out.println("- " + cookies.get(i).toString());
}
}
//进行页面跳转
String url = ""; // 页面跳转
Header locationHeader = response.getFirstHeader("Location");
// System.out.println(locationHeader.getValue());
if (locationHeader != null) {
url = locationHeader.getValue(); // 得到跳转href
HttpGet httpget1 = new HttpGet(url);
response = httpclient.execute(httpget1);
// 登陆成功。。。hoho
}
entity = response.getEntity();
// System.out.println(response.getStatusLine());
if (entity != null) {
// System.out.println("Response content length: " + entity.getContentLength());
}
// 显示结果
BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"));
String line = null;
while ((line = reader.readLine()) != null) {
// System.out.println(line);
}
//自动打卡
// 访问网站的子网页。
HttpPost httppost1 = new HttpPost("http://home.hi.mop.com/ajaxGetContinusLoginAward.do"); // 设置个人信息页面
httppost1.addHeader("Content-Type", "text/plain;charset=UTF-8");
httppost1.addHeader("Accept", "text/plain, */*");
httppost1.addHeader("X-Requested-With", "XMLHttpRequest");
httppost1.addHeader("Referer", "http://home.hi.mop.com/Home.do");
response = httpclient.execute(httppost1);
entity = response.getEntity();
// System.out.println(response.getStatusLine());
if(response.getStatusLine().toString().indexOf("HTTP/1.1 200 OK")>=0){
ret = true;
}
if (entity != null) {
// System.out.println("Response content length: " + entity.getContentLength());
}
// 显示结果
reader = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"));
line = null;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (Exception e) {
} finally {
httpclient.getConnectionManager().shutdown();
}
return ret;
}
}
⑤ js怎么跟Android和ios进行交互
<script>
function view(id){
//alert(id);
myjs.passIdToApp(id);
// passIdApp(id);
}
< /script>
*******************************************************我是分割线****************************************************************
NSString *htmlPath=[[NSBundle mainBundle] resourcePath];
htmlPath=[htmlPath :@"Test.html"];
NSURL *localURL=[[NSURL alloc]initFileURLWithPath:htmlPath];
NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:localURL];
[self.mywebview loadRequest:request];
JSContext *context = [self.mywebview valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
context[@"myjs.passIdToApp"] = ^() {
NSLog(@"Begin Log");
NSArray *args = [JSContext currentArguments];
for (JSValue *jsVal in args) {
NSLog(@"%@", jsVal);
NSString *proctID= [NSString stringWithFormat:@"%@",jsVal];
[self.navigationController pushViewController:[[Details_VC alloc]initWithProctID:proctID] animated:YES];
}
// JSValue *this = [JSContext currentThis];
NSLog(@"-------End Log-------");
};
*******************************************************我还是分割线****************************************************************
如果只调用passIdApp(id); 但是如果改成了myjs.passIdApp(id);就无法获取数据了
⑥ java中关于伪造IP地址的方法
物理意义上没有“伪造Ip”这一说,只有使用代理IP。
⑦ 用java嵌入谷歌、火狐或者webkit浏览器内核怎么做
< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
< html xmlns="http://www.w3.org/1999/xhtml" >
< head >
< meta http-equiv="Content-Type" content="text/html; charset=utf-8" / >
< script type="text/javascript" >
function calculate()
{
var gcj_1 = parseFloat(document.getElementById('l_1').value);
var gcj_2 = parseFloat(document.getElementById('l_2').value);
var gcj_3 = parseFloat(document.getElementById('l_3').value);
var fwj_1 = parseFloat(document.getElementById('r_1').value);
var fwj_2 = parseFloat(document.getElementById('r_2').value);
var fwj_3 = parseFloat(document.getElementById('r_3').value);
var jl = parseFloat(document.getElementById('s').value);
var x = parseFloat(document.getElementById('x').value);
var y = parseFloat(document.getElementById('y').value);
var d,f,m;
d=gcj_1+fwj_1;
f=gcj_2+fwj_2;
m=gcj_3+fwj_3;
m > 60?(m-=60,f+=1):m=m;
f > 60?(f-=60,d+=1):f=f;
d+=180;
d > 360?d-=360:d=d;
var tr_value = new Array(8);
var num=document.getElementById('myTable').getElementsByTagName('tr').length;
tr_value[0]=num-1;
tr_value[1]='';
tr_value[2]=d+'°'+f+ '′' + m + '″';
document.getElementById('r_1').value=d;
document.getElementById('r_2').value=f;
document.getElementById('r_3').value=m;
d+=(f/60);
d+=(m/3600);
d=(d/180)*Math.PI;
var x1=new Number(jl*Math.cos(d));
var y1=new Number(jl*Math.sin(d));
var x2=new Number(x+x1);
var y2=new Number(y+y1);
tr_value[3]=jl;
tr_value[4]=x1.toFixed(2);
tr_value[5]=y1.toFixed(2);
tr_value[6]=x2.toFixed(2);
tr_value[7]=y2.toFixed(2);
document.getElementById('s').value='';
document.getElementById('x').value=x2.toFixed(2);
document.getElementById('y').value=y2.toFixed(2);
document.getElementById('l_1').value='';
document.getElementById('l_2').value='';
document.getElementById('l_3').value='';
var x=document.getElementById('myTable').insertRow(num-1);
var tr = new Array(8);
var i;
for(i=0;i < 8;i++)
{
tr[i] =x.insertCell(i);
tr[i].innerHTML=tr_value[i];
}
}
< /script >
< style type="text/css" >
@charset "utf-8";
/* CSS Document */
table{
background-color:#E2FFD8;
height:auto;
border-spacing: 2px;
}
table, th, td {
border: 1px solid #ccc;
border-collapse: collapse;
}
th{
background-color:#B1DBF4;
height:20px;
width:150px;
}
td{
text-align:center;
height:20px;
}
input{
width:100px;
}
#l_1,#l_2,#l_3,#r_1,#r_2,#r_3,#r_d,#r_f,#r_m{
width:38px;
color:#999;
}
< /style >
< title > 三维导线控制点成果计算表 < /title >
< /head >
< body >
< form >
< table id="myTable" >
< tr >
< th > 点号 < /th >
< th > 观测角 < /th >
< th > 方位角 < /th >
< th > 距离/m < /th >
< th > △X/m < /th >
< th > △Y/m < /th >
< th > X/m < /th >
< th > Y/m < /th >
< /tr >
< tr >
< td > < /td >
< td >
< input required="required" id="l_1" value="度" onfocus="if(this.value=='度'){this.value=''}" onblur="if(this.value==''){this.value='度';}"/ >
< input required="required" id="l_2" value="分" onfocus="if(this.value=='分'){this.value=''}" onblur="if(this.value==''){this.value='分';}"/ >
< input required="required" id="l_3" value="秒" onfocus="if(this.value=='秒'){this.value=''}" onblur="if(this.value==''){this.value='秒';}"/ >
< /td >
< td >
< input required="required" id="r_1" value="度" onfocus="if(this.value=='度'){this.value=''}" onblur="if(this.value==''){this.value='度';}"/ >
< input required="required" id="r_2" value="分" onfocus="if(this.value=='分'){this.value=''}" onblur="if(this.value==''){this.value='分';}"/ >
< input required="required" id="r_3" value="秒" onfocus="if(this.value=='秒'){this.value=''}" onblur="if(this.value==''){this.value='秒';}"/ >
< /td >
< td > < input required="required" id="s"/ > < /td >
< td > < /td >
< td > < /td >
< td > < input required="required" id="x"/ > < /td >
< td > < input required="required" id="y"/ > < /td >
< /tr >
< /table >
< input type="submit" value="计算" onClick="calculate()" / >
< input type="reset" value="清空" / >
< /form >
< /body >
< /html >
⑧ ipad能够编程吗
iPad上是能够进行编程的,因为在2016年6月14日,苹果召开WWDC16开发者大会上,围绕开发者主题推出了一款iPad平台的应用开发工具Swift Playgrounds,现在开发者可以直接在iPad进行编程了。
SwiftPlaygrounds这款app是一款适用于编程初学者的 iPad app,它让用户可以一边写代码,一边看到代码造就的成果。在左侧输入代码,在右侧立即就能呈现效果。
同时,Swift 是一种新的编程语言,可用于编写 iOS 和 macOS 应用,它结合了 C 和 Objective-C 的优点并且不受C兼容性的限制。
(8)webkitforjava扩展阅读:
Swift 作为一种快速而高效的语言,有着它自己的独特优势,Swift 将现代编程语言的精华和苹果工程师文化的智慧结合了起来。编译器对性能进行了优化,编程语言对开发进行了优化,两者互不干扰。Swift 既可以用于开发“hello, world”这样的小程序,也可以用于开发一套完整的操作系统。
早在2015年12月4日,苹果公司就已经宣布其Swift编程语言现在开放源代码,长达600多页的The Swift Programming Language可以在线免费下载,同时也可以在苹果官方Github下载。
参考资料来源:网络-SWIFT (计算机编程语言)
⑨ java培训有哪些课程
市面上大多数的java课程内容其实都大同小异,理论知识讲解会在四个月左右。而接下来会进行长达一个月左右的实战演练环节。
理论课程上,最开始肯定是最基础的内容:JavaSE,这一阶段会接触到Java基础语法、面向对象编程思想、Java常用API、多线程并发编程、数据结构/集合框架、IO/网络编程/反射/设计模式。这一阶段往往也是最重要的,后面很多知识和框架的应用都是基于这一基础来的。学完这一部分,就能做一些简单的桌面应用程序设计。
之后,就是一些比较进阶的内容了,主流数据库管理系统、Java前端开发技术、流行框架应用,都是要慢慢深入的。
最后,也是最重要的,就是实战项目的训练,掌握了再多理论知识没有实战的支撑也没有用。而企业需要的也正是你的实战能力。
可能表面上看大多数的学校课程都很雷同,但其实也有要注意的点,就是看学校的课程有没有实时更新。随着时代发展,Java也融入了很多新元素。只有最新的课程才是企业真正所需要的。
⑩ java后端怎么接收前端的异步请求
前端提交
POST /api/test HTTP/1.1
Host: 192.168.135.69:81
Connection: keep-alive
Content-Length: 18
Origin: http://192.168.135.69:81
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1
Content-Type: application/x-www-form-urlencoded
Accept: */*
Referer: http://192.168.135.69:81/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
数据类型
{"phone":"222222"}
后台代码
@At
@Ok("json")
@Filters
@POST
@AdaptBy(type= JsonAdaptor.class)
public Object test(@Param("..") NutMap nutMap, HttpServletRequest req) {undefined
System.out.println("nutMap::" + nutMap);
System.out.println("longin ::" + req);
return Result.success("system.success");
}
报错信息
2019-01-05 20:02:20,560 org.nutz.ioc.loader.combo.ComboIocLoader.printFoundIocBean(ComboIocLoader.java:226) DEBUG - Found IocObject(portalGlobalsNavService) in AnnotationIocLoader(packages=[com.yunqi])
2019-01-05 20:02:20,560 org.nutz.ioc.impl.NutIoc.get(NutIoc.java:223) DEBUG - >> Make...'portalGlobalsNavService'
2019-01-05 20:02:20,560 org.nutz.ioc.impl.ScopeContext.save(ScopeContext.java:65) DEBUG - Save object 'portalGlobalsNavService' to [app]
2019-01-05 20:02:20,560 org.nutz.ioc.impl.NutIoc.get(NutIoc.java:166) DEBUG - Get ''<>
2019-01-05 20:02:20,560 org.nutz.ioc.aop.impl.DefaultMirrorFactory.getMirror(DefaultMirrorFactory.java:76) DEBUG - Load class com.yunqi.moles.service.portal.PortalGlobalsNavService without AOP
2019-01-05 20:02:20,560 org.nutz.ioc.impl.NutIoc.get(NutIoc.java:166) DEBUG - Get ''<>
2019-01-05 20:02:20,561 org.nutz.service.EntityService.(EntityService.java:41) DEBUG - Get TypeParams for self : com.yunqi.moles.models.portal.Portal_Globals_navnutMap::null
longin ::org.apache.shiro.web.servlet.ShiroHttpServletRequest@334e3d74
2019-01-05 20:02:20,572 com.yunqi.common.processor.LogTimeProcessor.process(LogTimeProcessor.java:24) DEBUG - [POST]URI=/app/test 60ms
————————————————
版权声明:本文为CSDN博主“weixin_39657249”的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39657249/article/details/114925997